其他分享
首页 > 其他分享> > 【Http】一文备忘Http状态码(406,415,422)

【Http】一文备忘Http状态码(406,415,422)

作者:互联网

最近在调试接口时,web api 报了一个415状态码。好久没见到这个状态码,一时还真不知道啥情况。所以,人的大脑是有遗忘规律的,为了加深印象,所以我觉得我有必要再复习一下。

1.HTTP的状态码

首先复习一下所有的状态码。

——摘自杨旭老师B站视频

本篇重点关注状态码406和415,顺带看一下422。

2.”我要的你不给“——406

在http请求中,Accept表明客户端希望接收的数据类型。当请求包含accept头,在ASP.NET Core框架中,将会:

一旦找不到格式化器,ASP.NET Core将会:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers(options =>
    {
        options.ReturnHttpNotAcceptable = true;
    })
}

如果请求没有Accept头:

Accept: */*,..,..,如果Accept 包含*/*,那么就会忽略Accept,除非做如下配置:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers(options =>
    {
        options.RespectBrowserAcceptHeader = true; // false by default
    });
}

这样,在使用 API 时,与在浏览器中的体验一致:

3.“我给的你不要”——415

说会我们问题的初衷,报了415,我这边ajax设置的Content-Type:application/x-www-form-urlencoded,然后asp.net core返回了415.

在HTTP中,Content-Type代表客户端发送的实体数据的数据类型,如果客户端是以application/x-www-form-urlencoded ,在asp.net core中用[FromBody]接收,服务端api是不会接收数据,便会返回415 Unsupported Media Type-不支持的媒体类型。

4.“我给的你还不要”——422

顺带提一下并不常用,但是却非常有用的状态码——422。

422:Unprocessable entity,它是HTTP扩展协议的一部分。

但是服务器仍然无法处理这个实体数据,这时就可以返回422。所以它通常是用来表示语意上有错误,或者不符合接口要求的数据,通常就表示实体验证的错误。对于实体模型验证错误:

ASP.NET Core默认使用的是400状态码-Bad Request

{
  "errors": {
  },
  "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
  "title": "One or more validation errors occurred.",
  "status": 400,
  "traceId": "|cb69a381-495c34b204e78961."
}

采用422会更准确的说明是实体数据问题。如果想要服务端返回422,还需要做单独配置,详细配置如下:

services.AddControllers(options =>
{
    options.ReturnHttpNotAcceptable = true;
})
.ConfigureApiBehaviorOptions(options =>
{
    options.InvalidModelStateResponseFactory = context =>
    {
        var problemDetails = new ValidationProblemDetails(context.ModelState)
        {
            Type = "https://tools.ietf.org/html/rfc7231#section-6.5.1",
            Title = "One or more validation errors occurred.",
            Status = StatusCodes.Status422UnprocessableEntity,
            Detail = "",
            Instance = context.HttpContext.Request.Path
        };
        problemDetails.Extensions.Add("traceId", context.HttpContext.TraceIdentifier);
        return new UnprocessableEntityObjectResult(problemDetails)
        {
            ContentTypes = { "application/problem+json" }
        };
	};
});
{
  "errors": {
  },
  "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
  "title": "One or more validation errors occurred.",
  "status": 422,
  "detail": "",
  "instance": "/api/admin/Sms",
  "traceId": "0HM25M2D86T30:00000001"
}

标签:Http,请求,415,备忘,406,API,服务器,422,options
来源: https://www.cnblogs.com/RandyField/p/13549318.html