ASP.NET Web API 2 媒体类型格式化程序
Ø 简介
在之前的ASP.NET Web API 2 消息处理管道文章中有提到,在 Web API 的生命周期中,还包含比较中要的一部分,就是媒体类型格式化程序,该程序主要用于处理 Web API 中的请求和响应数据的格式处理,比如常用的有 JSON、XML 处理程序等。
Ø 提示:为了简单,下面称“媒体类型格式化程序”为“格式化程序”。本文主要涉及一下几点:
1. 什么是格式化程序
2. 设置默认格式化程序
3. 根据参数决定响应数据格式(JSON/XML)
4. JSON 格式化程序相关设置
5. XML 格式化程序相关设置
6. 其他
Ø 在开始之前,首先添加以下代码:
1. 定义一个 CustomerResModel 模型
/// <summary>
/// 客户响应模型。
/// </summary>
public class CustomerResModel
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime CreateTime { get; set; }
public DateTime? UpdateTime { get; set; }
}
2. 再添加一个 CustomerController 控制器
[RoutePrefix("api/customer")]
public class CustomerController : ApiController
{
/// <summary>
/// 客户数组。
/// </summary>
private static CustomerResModel[] Customers = new CustomerResModel[]
{
new CustomerResModel(){ Id = 1, Name = "爱奇艺", CreateTime = DateTime.Parse("2018-05-02"), UpdateTime = null },
new CustomerResModel(){ Id = 2, Name = "腾讯视频", CreateTime = DateTime.Parse("2018-05-02 17:38:25"), UpdateTime = DateTime.Parse("2018-05-02 17:41:33") }
};
/// <summary>
/// 获取客户。
/// </summary>
[Route("getCustomer"), HttpGet]
public HttpResponseMessage GetCustomer(HttpRequestMessage request, int id)
{
var data = Customers.FirstOrDefault(o => o.Id == id);
return request.CreateResponse(HttpStatusCode.OK, data);
}
/// <summary>
/// 获取客户列表。
/// </summary>
[Route("getCustomers"), HttpGet]
public CustomerResModel[] GetCustomers()
{
return Customers;
}
}
1. 什么是格式化程序
1) 格式化程序是一系列用于解析请求和响应数据的类,这些类都直接或间接继承于 System.Net.Http.Formatting.MediaTypeFormatter 抽象类。我们可根据自己的需要,个性化设置格式化程序的行为,或者重写格式化程序(本文暂且不涉及此内容)。
2) 当一个请求到达时,消息处理程序会根据请求头中的 Content-Type 找到与之匹配的格式化程序,来解析请求数据。比如:Content-Type:application/json 则使用 System.Net.Http.Formatting.JsonMediaTypeFormatter 来解析。
3) 同样,响应数据格式则根据请求头中的 Accept 类型,找到匹配的格式化程序,来解析响应数据,再转为字节流响应请求。当然 Web API 也支持以 URL 参数来映射需要的格式化程序。
2. 设置默认格式化程序
Web API 默认包含以下四种格式化程序,其中 Json、XML 格式化程序比较常用,如果请求头的 Accept 未指定期望接受的类型(也就是 Accept:*/*),Web API 则会按照格式化程序集合中的一个来解析,也就是索引为0的格式化程序。可以看到,这里第一个是 Json 格式化程序。
1) 搞清楚原理之后就好办了,在 WebApiConfig.cs 中加入代码:
var xmlFormatter = config.Formatters.XmlFormatter;
config.Formatters.Remove(xmlFormatter);
config.Formatters.Insert(0, xmlFormatter);
2) 这样默认就为 XML 格式化程序了,发送请求:
1. URL:GET /api/customer/getCustomers HTTP/1.1
2. Request Accept: */*
3. Response Content-Type: application/xml; charset=utf-8
4. Response Text:
Ø 注意:在其他的一些博文中,有介绍采用下面两种方式,来设置默认格式化程序。
1. config.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
这种方式表示:XML 格式化程序为第一项,且请求头 Accept 为 */* 时,并不会以 XML 格式响应。但是指定了 Accept:application/xml 或参数指定 xml 时,还是会以 XML 格式响应。
2. config.Formatters.Remove(config.Formatters.XmlFormatter);
这种方式表示:直接将 XML 格式化程序移除,这样无论什么情况下都不能使用 XML 格式化程序了。所以,并不建议采用此方式!
3. 根据参数决定响应数据格式(JSON/XML)
1) 在 WebApiConfig.cs 中加入代码
config.Formatters.JsonFormatter.MediaTypeMappings.Add(new System.Net.Http.Formatting.QueryStringMapping("t", "json", "application/json"));
config.Formatters.XmlFormatter.MediaTypeMappings.Add(new System.Net.Http.Formatting.QueryStringMapping("t", "xml", "application/xml"));
2) 发送请求
1. URL:GET /api/customer/getCustomers?t=json HTTP/1.1
2. Request Accept: */*
3. Response Content-Type: application/json; charset=utf-8
4. Response Text:
4. JSON 格式化程序相关设置
JSON 格式化程序的序列化相关设置,主要使用 config.Formatters.JsonFormatter.SerializerSettings 属性,而该属性是一个 Newtonsoft.Json.JsonSerializerSettings 类型,所以 Web API 是借用了 Newtonsoft.Json 来完成对 JSON 序列化和反序列化的操作。既然这样,掌握了 Newtonsoft.Json 的知识,JSON 格式化程序的相关设置也不再话下了,更多 Newtonsoft.Json 的运用可参考:http://www.cnblogs.com/abeam/p/8295765.html
JSON 格式化程序分为单独设置 Action 和全局设置,下面分别演示这两种方式:
1) 单独设置 Action
1. 修改 GetCustomer 的代码
var data = Customers.FirstOrDefault(o => o.Id == id);
var formatter = new JsonMediaTypeFormatter();
formatter.SerializerSettings.Formatting = Formatting.Indented; //json 格式化
formatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); //json 成员以驼峰命名(首字母小写)
formatter.SerializerSettings.NullValueHandling = NullValueHandling.Ignore; //忽略 null(空)值
formatter.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss fff"; //日期格式化,默认:yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK
formatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; //忽略循环引用的成员
return request.CreateResponse(HttpStatusCode.OK, data, formatter); //注意:这里指定 formatter 后,请求参数尽管是t=xml,也将以json格式返回
2. 调用 /api/customer/getCustomer?id=1 接口,将看到如下结果:
2) 全局设置(应用到每个 Action 的请求)
其实,与单独设置 Action 一样,只是这里的 JsonMediaTypeFormatter 对象并不是 new 出来的,是从全局格式化程序中取出来的,所以这里的设置是全局型的设置。这样就可能有一个疑问了,如果 Action 中设置了全局也设置了,以哪个设置为准,答案是以 Action 中提供的格式化程序为准(经验证)。
1. 在 WebApiConfig.cs 中加入代码:
var jsonFormatter = config.Formatters.OfType<System.Net.Http.Formatting.JsonMediaTypeFormatter>().First();
设置代码与 Action 中的设置一致,就省略了…
2. 调用 /api/customer/getCustomers 接口,将看到如下结果:
5. XML 格式化程序相关设置
其实,XML 格式化程序使用相对较少,所以,在有用到时再来研究吧~
6. 其他
1) 获取全局 System.Web.Http.HttpConfiguration 对象
我们可以使用 System.Web.Http.GlobalConfiguration.Configuration 属性获取全局 HttpConfiguration 对象,该对象与 WebApiConfig.Register() 方法的 config 参数是同一个实例。例如,以下代码是同等的(设置日期格式化):
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.IsoDateTimeConverter()
{
DateTimeFormat = "yyyy-MM-dd HH:mm:ss fff"
});
//同等于
config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.IsoDateTimeConverter()
{
DateTimeFormat = "yyyy-MM-dd HH:mm:ss fff"
});
2) 设置(添加/删除)格式化程序所支持的媒体类型
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
ASP.NET Web API 2 媒体类型格式化程序的更多相关文章
- 【ASP.NET Web API教程】6 格式化与模型绑定
原文:[ASP.NET Web API教程]6 格式化与模型绑定 6 Formats and Model Binding 6 格式化与模型绑定 本文引自:http://www.asp.net/web- ...
- ASP.NET Web Api返回对象类型为JSON还是XML
在Umbraco平台上开发过程中,我用WebApi返回JSON result给前端 前端使用React调用这个web api来获取JSON result 我写的web api方法是返回JSON 类型的 ...
- ASP.NET Web API 2 消息处理管道
Ø 前言 ASP.NET 的应用程序都会有自己的消息处理管道和生命周期,比如:ASP.NET Web 应用程序(Web Form).ASP.NET MVC,还有本文将讨论的 ASP.NET Web ...
- ASP.NET WEB API处理流程
前言:大图请看 http://www.asp.net/posters/web-api/ASP.NET-Web-API-Poster.pdf Web Api Hosting 我们不仅可以通过Web应用程 ...
- ASP.NET Web API的消息处理管道: Self Host下的消息处理管道[上篇]
ASP.NET Web API的消息处理管道: Self Host下的消息处理管道[上篇] ASP.NET Web API服务端框架核心是一个独立于具体寄宿环境的消息处理管道,它不关心请求消息来源于何 ...
- Asp.Net Web API 2第十二课——Media Formatters媒体格式化器
前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 本教程演示如何在ASP.N ...
- 【ASP.NET Web API教程】6.1 媒体格式化器
http://www.cnblogs.com/r01cn/archive/2013/05/17/3083400.html 6.1 Media Formatters6.1 媒体格式化器 本文引自:htt ...
- ASP.NET Web API路由系统:路由系统的几个核心类型
虽然ASP.NET Web API框架采用与ASP.NET MVC框架类似的管道式设计,但是ASP.NET Web API管道的核心部分(定义在程序集System.Web.Http.dll中)已经移除 ...
- ASP.NET Web API框架揭秘:路由系统的几个核心类型
ASP.NET Web API框架揭秘:路由系统的几个核心类型 虽然ASP.NET Web API框架采用与ASP.NET MVC框架类似的管道式设计,但是ASP.NET Web API管道的核心部分 ...
随机推荐
- Nowcoder | [题解-N210]牛客OI月赛2-提高组
比赛连接戳这里^_^ 我才不会说这是我出的题(逃) 周赛题解\((2018.10.14)\) \(T1\) \(25\sim50\)分做法\(:\)直接爆搜 作为一个良心仁慈又可爱的出题人当然\(T1 ...
- emwin之2D图形流位图显示的方法
@2018-10-31 [需求] 界面上绘制状态指示图标 [方法] --① 方法一 外部存储介质上的图标读写与显示 i . 将要显示的图标使用官方软件<BmpCvt.exe>转换成 &q ...
- 觉得一篇讲SPFA还不错的文章
我觉得他整理的有一些乱,我都改成插入代码了,看的顺眼一些 转载自http://blog.csdn.net/juststeps/article/details/8772755 下面的都是原文: 最短路径 ...
- Navicat Premium 12 破解(MySQL、MariaDB、MongoDB、SQL Server、SQLite)
打开注入到安装目录中的exe中 破解提示(还没好,继续看下去) 如果你安装的是中文版,选一下中文版(英文默认即可),获取一下key(名字和组织可以自定义) 打开Navicat,选择注册(第一次打开选注 ...
- OO第三阶段纪实
$0 写在前面 万里长征已过大半,即将迎来胜利的曙光.一路走来,经历过种种艰难,体会颇深.希望能记录下这篇博文,来总结这一个月来的收获与感悟. $1 规格化设计的发展历史 上世纪50年代,软件伴随着第 ...
- js获取元素位置和style的兼容性写法
今天说一下js获取元素位置和style的方法.当然不只是element.style那么简单.. 主角:getBoundingClientRect,getClientRects,getComputedS ...
- Ubuntu下安装Flask虚拟环境及使用
一.关于Flask介绍 诞生时间:Flask诞生于2010年,是Armin ronacher(人名)用 Python 语言基于 Werkzeug工具箱编写的轻量级Web开发框架. Flask框架包含两 ...
- Java,mysql String与date类型转换
String 与 date类型转换 字符串转换成日期类型: SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");//小写 ...
- 在MacOS上使用gdb(cgdb)调试Golang程序
如果你在MacOS上使用GDB工具载入Golang程序时无法载入,这篇文章可以解决.本文不具体介绍调试的方法,网上的文章太多了就不赘述了. cgdb使用的是gdb的内核,方法和原理试用本文. 问题分析 ...
- Django(十四)分页器(paginator)及自定义分页D
http://www.mamicode.com/info-detail-1724597.html http://www.cnblogs.com/wupeiqi/articles/5246483.htm ...