ASP.NET Core实现http请求头部的内容协商 (json+xml)(如何根据请求的媒体类型调整数据的输出)
内容协商概念
内容协商Content Negotiation:允许客户端和服务器通过协商来决定 相互之间数据的 传输格式、语言等。
HTTP头部
http头部的媒体类型Media Types定义 accept
和 Content-type
-
HTTP请求头中的
accept
:客户端希望服务器返回的媒体格式 -
HTTP返回头中的
content-type
:对应请求时的accept,表示服务器返回数据的类型
后端/服务器端处理json/xml/其他的数据格式步骤
目前主流数据传输格式:json和xml
目的:
-
HTTP默认是传递
json
格式的数据,一旦在header请求中指定数据类型为application/xml
,我们需要返回对应的数据。 -
但是遇到无法识别的数据格式,需要后端返回错误代码
406
,表示unacceptable
我们只需要在 Startup.cs
的 ConfigureServices
方法中添加以下代码即可:
// services.AddControllers(); // 帮助我们在创建API的时候向IOC容器中添加一个控制器的框架服务
// 配置控制器 -> 处理mediatype
// false: 所有API都会忽略请求的头部,都统一回复默认的数据结构json
services.AddControllers(setupAction =>
{
setupAction.ReturnHttpNotAcceptable = true; // 处理其他格式
// 给api添加xml的处理(支持)AddXmlDataContractSerializerFormatters 配置所有与xml相关的input+output相关代码
// setupAction.OutputFormatters.Add(
// new XmlDataContractSerializerOutputFormatter());
}).AddXmlDataContractSerializerFormatters(); // 406 Not Acceptable // 处理xml格式
操作成功后再Postman中测试结果如下: