REST服务返回自定义的HttpResponseMessage
WebApi框架中对资源的操作,都是通过其Controller提供的各种方法(GET,POST,PUT,DELET等)来实现,而这些方法的返回信息有以下几种形式:
| 方法返回类型 | HttpResponseMessage |
| void | StateCode:204(No Content) |
| HttpResponseMessage | 直接返回HttpResponseMessage |
| IHttpActionResult | 调用ExecuteAsync方法去创建一个HttpResponseMessage 对象,让后将这个对象转换成Http响应消息 |
| 其他类型(如int,string等) | 将序列化的值写到响应消息的内容中,返回StateCode:200(OK) |
1:返回void的情况不多做介绍,返回给浏览器的responseMessage如下:
HTTP/ No Content Server: Microsoft-IIS/8.0 Date: Mon, Jan :: GMT
2:返回HttpResponseMessage
我们自定义的HttpResponseMessage主要可以通过这种返回类型来实现,例如,自定义response的Header:
public HttpResponseMessage Get()
{
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, "value");
response.Content = new StringContent("hello", Encoding.Unicode);
response.Headers.CacheControl = new CacheControlHeaderValue()
{
MaxAge = TimeSpan.FromMinutes()
};
return response;
}
又例如,对方法的不同执行结果返回不同的HttpResponseMessage:
[HttpGet]
public HttpResponseMessage GetTopic(int id)
{
TopicModel topic;
using (var connection = new OracleConnection(Setting.ConnectionStr))
{
var sql = string.Format("select * from {0} where topicid=:TopicId", Setting.TopicModelTable);
var condition = new
{
TopicId = id
};
connection.Open();
topic = connection.QueryList<TopicModel>(sql,condition, null,null).FirstOrDefault();
connection.Close();
}
HttpResponseMessage resp;
if (topic == null)
{
resp = new HttpResponseMessage(HttpStatusCode.NoContent)
{
ReasonPhrase = "no resource found"
};
}
else
{
resp = Request.CreateResponse(HttpStatusCode.OK, topic);
}
return resp;
}
在上例中,自定义HttpResponseMessage有两种方法,一种是通过构造函数,new HttpResponseMessage,同时用JSON序列化后的实体对象创建HttpResponseMessage中的Content(通过new StringContent):
new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StringContent(JsonConvert.SerializeObject(topic))
};
另外一种是直接通过实体,自己JSON序列化后形成HttpResponseMessage:
Request.CreateResponse(HttpStatusCode.OK, topic); //topic为实体对象
这两种创建响应信息的方式,返回给浏览器的响应略有不同,前者返回给浏览器Header如下:
HTTP/ OK Content-Length: Content-Type: text/plain; charset=utf- Server: Microsoft-HTTPAPI/2.0 Date: Tue, Jul :: GMT
后者返回给浏览器Header如下:
HTTP/ OK Content-Length: Content-Type: text/json; charset=utf- Server: Microsoft-HTTPAPI/2.0 Date: Tue, Jul :: GMT
区别就在于Content-Type,因此,在某些对Content-Type有特殊要求的场合需要区分。
3:没怎么用过,对HttpResponseMessage提供一定的封装。
4:直接返回自定义对象,则默认序列化为JSON对象,加上StateCode:200(OK),形成新的HttpResponseMessage返回给浏览器:
HTTP/ OK Content-Length: Content-Type: text/xml; charset=utf- Server: Microsoft-HTTPAPI/2.0 Date: Tue, Jul :: GMT
其实HttpResponseMessage对象中的Header中的Content-Type是可以通过设置HttpRequestMessage的Header中的Accept来指定的,即内容协商机制,如下的HttpRequestMessage:
GET http://192.168.22.6:7777/api/topic/3 HTTP/1.1 User-Agent: Fiddler Accept: text/xml Content-Type: text/json Host: Content-Length:
即协商指定接收Content-Type为text/xml,以下是服务返回的HttpResponseMessage的Header:
HTTP/ OK Content-Length: Content-Type: text/xml; charset=utf- Server: Microsoft-HTTPAPI/2.0 Date: Tue, Jul :: GMT
由此可见,虽然服务返回的Content-Type是JSON,但最终返回给浏览器的Content-Type被协商为了XML格式。
REST服务返回自定义的HttpResponseMessage的更多相关文章
- angular(3)服务 --注入---自定义模块--单页面应用
ng内部,一旦发生值改变操作,如$scope.m=x,就会自动轮询$digest队列,触发指定的$watch,调用其回调函数,然后修改dom树. 干货:https://github.com/xufei ...
- Nginx挂载维护页或返回自定义响应信息
在服务停机升级或者服务暂不可用时,往往希望能够返回给用户更为明确和友好的响应信息.可以通过修改nginx配置文件,达到返回自定义信息的效果.有如下几种配置方式: (1)Nginx接收到的所有请求,都返 ...
- AngularJS内建服务以及自定义服务的用法
在AngularJS中, 服务是一个比较重要的部分,它是一个对象或者是函数,可以在你的AngularJS的应用中使用.接下来介绍几种比较常用的内建服务以及自定义服务的方法. [内建服务] (1)loc ...
- springboot 404返回自定义json(只进入过滤器)
今天在公司没事干,记一次springboot遇到的一些坑,在百度上也没有搜到类似的问题和答案(或者说 答案不是我想要的) 当我们在SpringBoot遇到了404或者500的错误的时候,你们会怎么办? ...
- AJAX回调函数,返回JSON格式,应该返回自定义状态STATUS,但是却返回200
返回200应该是方法已经执行通的意思,但是没返回自定义的status,仔细一看json格式拼错了...
- 配合crond服务实现自定义周期备份MySQL数据库(使用innobackupex进行备份)
备份 新建一个脚本/root/backup.py,内容如下: #!/usr/bin/env python# -*- coding: utf-8 -*- ''' 脚本作者:昨夜星辰 脚本作用:配合cro ...
- 客户端获取服务端自定义类数据 z
客户端获取服务端自定义类数据 问题一:超时问题,在最后获取数据的时候突然提示服务超时,服务已断开 解决:配置文件添加: <bindings> <wsHttpBinding> & ...
- 阿里云容器服务--配置自定义路由服务应对DDOS攻击
阿里云容器服务--配置自定义路由服务应对DDOS攻击 摘要: 容器服务中,除了slb之外,自定义路由服务(基于HAProxy)也可以作为DDOS攻击的一道防线,本文阐述了几种方法来应对普通规模的DDO ...
- Linq to Sql:N层应用中的查询(上) : 返回自定义实体
原文:Linq to Sql:N层应用中的查询(上) : 返回自定义实体 如果允许在UI层直接访问Linq to Sql的DataContext,可以省去很多问题,譬如在处理多表join的时候,我们使 ...
随机推荐
- AC日记——最长最短单词 openjudge 1.7 25
25:最长最短单词 总时间限制: 1000ms 内存限制: 65536kB 描述 输入1行句子(不多于200个单词,每个单词长度不超过100),只包含字母.空格和逗号.单词由至少一个连续的字母构成 ...
- IIS7.5中神秘的ApplicationPoolIdentity
IIS7.5中(仅win7,win2008 SP2,win2008 R2支持),应用程序池的运行帐号,除了指定为LocalService,LocalSystem,NetWorkService这三种基本 ...
- Stunnel使用2
1.首先测试一下stunnel.exe,是否能正常运行,正常的话,不会报错,在桌面右下角位置显示. 2.第一步完成后,打开stunnel.conf,对stunnel进行配置,需要修改一下几项:(mys ...
- java 24 - 5 GUI之 鼠标移动改变窗体背景颜色
需求: 创建一个可改变背景颜色的窗口,鼠标移动到按钮上,窗口背景就会改变成特定的颜色 步骤: (大致上) 创建窗口对象 创建按钮对象 添加按钮到窗口中 设置窗口关闭监听事件 设置鼠标进入按钮区域的监听 ...
- Eclipse调整双击选取的字符颜色背景
Eclipse调整双击选取的字符颜色背景,如下图所示: 会有二点影响: 1. 编辑页的颜色 2. 右侧滚动条的小提示点的颜色.
- domReady方法(dom加载完成执行回调)
var domReady = function( fn ) { var isReady = false, ready = function(){ if(!isReady){ typeof fn === ...
- ie6-ie8中不支持opacity透明度的解决方法
ie6-ie8中是不支持的,需要加上下面这句话:filter: alpha(opacity=70);此外这种效果不能用ietester中的ie6测试,因为ietester的ie6这样写也是不透明的,但 ...
- 事故记录:php-cgi进程过多导致系统资源耗尽
事故现象:机房一台服务器运行一段时间后,突然发现系统资源即将被耗尽! 1)top命令查看一下系统的cpu ram swap的使用情况 由上图分析,可以看出1--共有602个进程,但其中有601个进程休 ...
- Java集合系列:-----------05LinkedList的底层实现
前面,我们已经学习了ArrayList,并了解了fail-fast机制.这一章我们接着学习List的实现类--LinkedList.和学习ArrayList一样,接下来呢,我们先对LinkedList ...
- 微软职位内部推荐-SDEII_ ECO
微软近期Open的职位: SDE II SDE II Organization Summary: Engineering, Customer interactions & Online (EC ...