【WebApi】(四)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请求准确无误的进行。
作者:Garfield
同步更新至个人博客:http://www.randyfield.cn/
本文版权归作者所有,未经许可禁止转载,否则保留追究法律责任的权利,若有需要请联系287572291@qq.com
微信公众号
扫描下方二维码关注个人微信公众号,实时获取更多干货