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的时候,我们使 ...
随机推荐
- JAVA面向对象之一
一.面向过程的思想和面向对象的思想 面向对象和面向过程的思想有着本质上的区别, 作为面向对象的思维来说,当你拿到一个问题时,你分析这个问题不再是第一步先做什么,第二步再做什么,这是面向过程的思维,你应 ...
- python中if __name__ == "__main__":用法解析
__name__: __name__作为模块的内置属性,简单点说呢,就是.py文件的调用方式. __main__: 如果__name__等于"__main__"就表示是直接执行. ...
- Unity 碰撞器
Unity引擎的碰撞器 常见的有Box Collider,Capsule Collider等等 IsTrigger(触发器) 在这些碰撞器中有一个属性 Is Trigger(是否使用触发器) 触发器事 ...
- 如何配置QuickFIX/N
Acceptor或者Initiator能够为您维护尽可能多的FIX会话,因而FIX会话标识的唯一性非常重要.在QuickFIX/N中,一个FIX会话的唯一标识是由:BeginString(FIX版本号 ...
- [No000001]一切都是最好的安排
<一切都是最好的安排> 从前有一个国家,地不大,人不多,但是人民过着悠闲快乐的生活,因为他们有一位不喜欢做事的国王和一位不喜欢做官的宰相. 国王没有什么不良嗜好,除了打猎以外,最喜欢与宰相 ...
- JavaScript Boolean 对象
JavaScript Boolean 对象 Boolean 对象 Boolean 对象用于转换一个不是 Boolean 类型的值转换为 Boolean 类型值 (true 或者false). Bool ...
- Centos5.8 安装SVN并配置HTTP访问
安装 svn sudo yum install subversion 测试 svn --version 安装 httpd 的 svn 模块 sudo yum install mod_dav_svn 前 ...
- noi题库(noi.openjudge.cn) 1.9编程基础之顺序查找T06——T15
T06 笨小猴 描述 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼.但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大! 这种方法的具体描述如下:假设maxn是单词 ...
- jboss:跟踪所有sql语句及sql参数
默认情况下,hibernate/JPA 在server.log中记录的SQL语句,参数都是用?代替的,这样不太方便. 网上留传的p6spy在最新的jboss上(EAP 6.0+版本)貌似已经不起作用了 ...
- caffe的python接口学习(2):生成solver文件
caffe在训练的时候,需要一些参数设置,我们一般将这些参数设置在一个叫solver.prototxt的文件里面,如下: base_lr: 0.001 display: 782 gamma: 0.1 ...