跟着官网学ASP.NET Core 6.0之设置响应数据的格式

跟着官网学ASP.NET Core 6.0之设置响应数据的格式

我们用ASP.NET Core开发Web API时,肯定会有返回值场景,ASP.NET Core则提供了三种返回类型:

  • 特定类型
  • IActionResult
  • ActionResult

特定类型

特定类型就是我们一般的数据类型或者自定义的类,还是拿之前的例子来说,如:

1
2
3
4
5
6
[HttpGet("all")]
public async Task<List<Order>> GetAllOrders()
{
_logger.LogInformation("查询所有订单!");
return await _context.Orders.ToListAsync();
}

我们可以看到,结果返回的是标准的JSON数组格式。特定类型简单,但是过于单一,有时候,我们想要返回一些其他状态类型的结果,这种方式便不可取了。

IActionResult和ActionResult

我们在用VS创建控制器时,选择包含读/写操作的API控制器时,VS会根据模板生成相应的代码,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
[HttpGet("{id}")]
public async Task<ActionResult<Order>> GetOrder(long id)
{
var order = await _context.Orders.FindAsync(id);

if (order == null)
{
return NotFound();
}

return order;
}

// PUT: api/Orders/5
// To protect from overposting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754
[HttpPut("{id}")]
public async Task<IActionResult> PutOrder(long id, Order order)
{
if (id != order.Id)
{
return BadRequest();
}

_context.Entry(order).State = EntityState.Modified;

try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!OrderExists(id))
{
return NotFound();
}
else
{
throw;
}
}

return NoContent();
}

我们从自动生成的代码中可以看出,在有返回值时,用的是ActionResult<T>,不需要返回值的方法则使用的IActionResult,方法内部的返回值类型也比较多,如NoContentNotFoundBadRequest等,它们其实都继承了ActionResultIActionResult,默认返回的content-type类型是application/json; charset=utf-8

响应数据的格式

在 ASP.NET Core 3.0之后,默认是基于 System.Text.Json来格式化JSON,默认格式为camelCase(驼峰命名法),如果想要设置为PascalCase格式,那么需要在Program.cs进行设置

1
builder.Services.AddControllers().AddJsonOptions(options => options.JsonSerializerOptions.PropertyNamingPolicy = null);


在ASP.NET Core 6.0中默认使用的是System.Text.Json,如果想换成Newtonsoft.Json怎么弄呢?需要安装Microsoft.AspNetCore.Mvc.NewtonsoftJson,然后去Program.cs中配置

1
2
3
4
builder.Services.AddControllers().AddNewtonsoftJson(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver()
{
NamingStrategy = new DefaultNamingStrategy()
});

换成NewtonsoftJson后,之前的AddJsonOptions便不再适用了,需要在AddNewtonsoftJson类进行设置


在ASP.NET Core中,默认 支持 application/json、text/json 和 text/plain 媒体类型,

服务端会根据请求头中的Accept标识中的类型作出相应的格式返回,默认是application/json,如果我们想要支持XML怎么弄呢?很简单,只需要在Program.cs添加AddXmlSerializerFormatters即可


如果你觉得现有的格式还是不足以支撑你现在有业务,别担心,ASP.NET Core提供自定义格式化,分别新建继承TextOutputFormatterTextInputFormatter类,重写父类的 CanReadType CanWriteTypeReadRequestBodyAsync WriteResponseBodyAsync 方法,然后将自定义的格式化类在Program.cs中的AddControllers添加到InputFormattersOutputFormatters ,如

好了,今天大概的了解了ASP.NET Core响应数据的格式,下一节,继续学习一下处理 ASP.NET Core Web API 中的错误

跟着官网学ASP.NET Core 6.0之设置响应数据的格式

https://blogs.52fx.biz/posts/4252655810.html

作者

eyiadmin

发布于

2022-02-03

更新于

2024-05-31

许可协议

评论