(四)Asp.net web api中的坑-【api的返回值】

  • void无返回值
  • IHttpActionResult
  • HttpResponseMessage
  • 自定义类型

我这里并不想赘述这些返回类型,

可以参考博文http://blog.csdn.net/leonken88/article/details/53063693

和大神的http://www.cnblogs.com/landeanfen/p/5501487.html

我要说我遇到的坑是,

public HttpResponseMessage DataHandler(RequestModel model)
{

不管是result = JsonConvert.SerializeObject(data);

return result,

return json<string>(result),

或者return Ok(result)

别人调用我的接口都是一个json字符串格式,”{\“name\”:\”123\”}”

}

以我想呢,既然你能收到这种字符串,自己反序列化下就ok了嘛,最后另外那边告诉我,他们的开发语言是c++,且这个http请求都是封装好的组件,类似dll那种只能调用,他们要求返回json,必须是{“name”:”123”},无转义,无双引号

这可难办,我试了好多种方式,每次都是返回带转义字符的json字符串,无奈多方查阅

[HttpPost]
public HttpResponseMessage DataHandler(RequestModel model)
{

string result=”{\“name\”:\”123\”}”;

return new HttpResponseMessage { Content = new StringContent(result, System.Text.Encoding.UTF8, "text/plain") };

}

这就对了,为什么呢?

原来是自己对http协议的学习不精,

1、 服务端需要返回一段普通文本给客户端,Content-Type="text/plain"
2 、服务端需要返回一段HTML代码给客户端 ,Content-Type="text/html"
3 、服务端需要返回一段XML代码给客户端 ,Content-Type="text/xml"
4 、服务端需要返回一段javascript代码给客户端,text/javascript
5 、服务端需要返回一段json串给客户端,application/Json

ASP.NET WebAPI是一套RESTful API开发框架。会自动序列化返回的对象成XML或JSON,其序列化后的格式取决于Request的header中的Accept。常见的有:

  • application/json
  • application/xml
  • text/json
  • text/xml(这两种已经被废弃了)

如果不指定的话默认返回的Content-Type是:application/json; charset=utf-8

要想http response 返回指定格式,

方法一:放弃自动序列化,返回httpResponseMessage,再手动设置

代码如下:

HttpResponseMessage resp = new HttpResponseMessage();

string result=”{\“name\”:\”123\”}”;

resp.Content = new StringContent(result, System.Text.Encoding.UTF8, ""text/plain");

方法二:设置httpConfiguration

但是这种方法有个弊端,是全局的,但是应该可以限定范围,暂时先不管了。

P.S.吐槽下,IE默认是不显示JSON的,会直接下载下来,所以开发人员工具就捕获不到HTTP报文,也没法看Header。

更多详情,请参考http://www.luckyonecn.com/blog/fix_content-type_to_Applicationjson_in_WebApi/

【知识点】http请求,不仅仅request中的content-type需要指定,response中的content-type也需要指定,客户端需要告诉服务端,我给你的是什么样的数据,content-type,服务端处理逻辑,返回给客户端,也需要告诉客户端,我给你是什么样的数据,content-type,双方按约定好的方式,进行通讯,才能确保整个http请求准确无误的进行。

时间: 2024-10-29 05:16:16

(四)Asp.net web api中的坑-【api的返回值】的相关文章

如何在ASP.NET Web站点中统一页面布局[Creating a Consistent Layout in ASP.NET Web Pages(Razor) Sites]

如何在ASP.NET Web站点中统一页面布局[Creating a Consistent Layout in ASP.NET Web Pages(Razor) Sites] 一.布局页面介绍[About Layout Pages] 很多网站有些内容需要显示在各个页面中,比如Header,Footer或者告诉用户已经登录的部分.ASP.NET允许你创建一个单独的文件来包含文本.标签和代码的内容块,从而搭建一个风格整齐的网站.接下来你就可以将这个内容块插入到任何你想要让它展示的页面中.采用这种方法

Windows API中的坑

本文主页链接:Windows API中的坑 ExpandEnvironmentStrings 风险: 进程会继承其父进程的环境变量,在展开如%APPDATA%等目录时,有可能父进程对此环境变量进行过修改,那么可能你获取的就不是你想要的当前SESSION的%APPDATA%了. 建议: 使用SHGetFolderPath系列函数来做这件事. GetModuleFileName 风险: 在DLL中调用时,若传入的instance参数为NULL,那获取的将是加载DLL的进程的EXE的路径,若需要获取D

ASP.NET web express中使用arcgis sliverlight

1. 在visual studio 2013 工具扩展中搜ESRI,选择合适的模版安装 2. 项目新建,刚刚安装的模版 3. 通常会报一个错误,interactions的 4. 工具->nugit程序管理包,搜索interactivity 进行安装(这里需要使用IE打开,否则会报一个指针错误) ASP.NET web express中使用arcgis sliverlight,布布扣,bubuko.com

ASP.NET Web网站中App_Code文件夹的作用及使用场景

原文地址:Web Site项目和ASP.NET Web Application中App_Code文件夹的作用作者:宾的宾 我现在要建一个ASP.NET的网站了,不难吧,开始动手.如下图: 这种方法建立Web Site项目,使用过的开发者都知道,如果需要新建一个类,例如DataBase.cs.此类只服务于web页面,不适于放入网站自身类库中,因此希望其独立存在于类库之外,只是用于在web应用程序中被web页面调用.这样一来此类最好不要通过形成dll文件,并将其放入bin文件夹以供web页面调用.但

ASP.NET Web Application中使用链接文件

最近重构一个内部的平台系统,作为一个平台,其下有几个子系统,每个子系统有自己的网站系统.而每个网站使用的是统一的风格,统一的验证机制,反馈系统,等等.所以,为了避免几个子系统中重复出现相同的资源或文件,我打算将以前的ASP.NET Web Site全部转换为ASP.NET Web Application,然后通过链接外部公共文件的方式解决这个问题.同时: 1. Web Application是Web Site的升级产品.2. Web Application允许添加链接方式,把其他目录的文件作为链

ASP.NET Web Service中使用Session 及 Session丢失解决方法 续

原文:ASP.NET Web Service中使用Session 及 Session丢失解决方法 续 1.关于Session丢失问题的说明汇总,参考这里 2.在Web Servcie中使用Session,需要对Web Method做如下处理 [WebMethod(EnableSession = true)]public void usingSession(){    Session["Name"] = "Name";} 如果不加EnableSession = tru

ASP.NET web 程序中使用Sqlite嵌入式数据库(相对路径)

string sqliteFilePath = Server.MapPath("~/App_Data/SQLite数据库名"); //这个文件是预先生成的数据库文件 SQLiteConnection conn = new SQLiteConnection("Data Source=" + sqliteFilePath);//声明一个SQLite数据库的链接 conn.Open();//打开数据库 当然,在这之前要先添加引用 System.Data.SQLite.dl

Asp.net中存储过程拖拽至dbml文件中,提示无法获得返回值

Asp.net中存储过程拖拽至dbml文件中,提示无法获得返回值,去属性表中设置这时候会提示你去属性表中更改返回类型. 其实存储过程返回的也是一张表,只不过有时候存储过程有点复杂或者写法不规范的话不能自动生成映射文件. 不能自动生成那就自己写一张表跟存储过程返回的那张表一样就行.然后拖拽至dbml中,然后设置属性中返回类型为这张表就行了.

【Android】Android中Service类onStartCommand的返回值有关问题(转)

@Override public int onStartCommand(Intent intent, int flags, int startId) { System.out.println("---------->>onStartCommand2"); return super.onStartCommand(intent, flags, startId); } Android开发的过程中,每次调用startService(Intent)的时候,都会调用该Service对象

ascii#ascii,对象类中找__repr__,获取其返回值

1 #!/usr/bin/env python 2 #ascii,对象类中找__repr__,获取其返回值 3 class Foo : 4 def __repr__(self): 5 return "hello" 6 7 obj = Foo() 8 r = ascii(obj) 9 print(r )