[HttpGet] public IActionResult Get() => Ok(_todoItemStore.GetList());上面代码非常简单返回一个todo列表,我们使用F12在浏览器中可以看到如下:
[HttpGet("Version")] public ContentResult GetVersion() => Content("v1.0.0");我们看到返回的Content-Type是text/plain
服务器驱动型内容协商(Server-driven negotiation):服务器根据客户端请求中的信息,如Accept头部字段(表示客户端可以接受的响应内容类型)、Accept-Language头部字段(表示客户端首选的语言)、Accept-Encoding头部字段(表示客户端支持的内容编码方式)等,决定响应内容。服务器会根据这些信息选择最适合的响应内容,并将其包含在响应中。
客户端驱动型内容协商(Agent-driven negotiation):客户端发送的请求中包含了资源的一些特定要求,例如通过使用Accept头部字段中指定特定的内容类型或者使用Quality Values(q值)来表明优先级。服务器根据这些请求条件来选择响应内容,然后返回最符合条件的内容。
Accept Accept-Charset Accept-Encoding Accept-Language VaryASP.NET Core默认使用JSON格式,ASP.NET Core中支持下列媒体类型:
application/json text/json text/plain当Action方法返回POCO(普通C#类),运行时会自动创建一个ObjectResult对象类封装这个POCO,客户端会收到序列化之后的对象,如果没有找到该对象将返回204 No Content 。
[HttpGet("{id:long}")] public TodoItem? GetPOCOById(long id) => _todoItemStore.GetById(id);当Accept出现在请求的Header中时则会发生内容协商,首先ASP.NET Core会按照顺序枚举头部Accept中的媒体类型,这个顺序会根据Accept中指定Q值的权重来枚举,尝试找到一个符合的格式化器来生成相应
builder.Services.AddControllers() .AddXmlSerializerFormatters();3.2 配置基于System.Text.Json格式化器
builder.Services.AddControllers() .AddJsonOptions(options => { // 堆代码 duidaima.com //JSON 序列化器将使用 .NET 对象的属性名作为 JSON 属性名,而不会进行任何额外的命名转换 options.JsonSerializerOptions.PropertyNamingPolicy = null; });3.3 配置基于Newtonsoft.Json格式化器
Microsoft.AspNetCore.Mvc.NewtonsoftJson配置如下:
builder.Services.AddControllers() .AddNewtonsoftJson();
Newtonsoft.Json比System.Text.Json提供了更多丰富的特性,System.Text.Json虽然没有Newtonsoft.Json提供的功能丰富,但是在性能方面更好,这个可以根据自己的需求来选择。
[ApiController] [Route("api/[controller]")] [Produces("application/json")] public class TodoItemsController : ControllerBase { .......... }源代码地址: