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

1.HTTP的状态码

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

  • 1xx:属于信息性的状态码。Web API并不使用1xx的状态码。

  • 2xx:意味着请求执行的很成功。

  • 3xx:用于跳转。例如告诉搜素引擎,某个页面的网址已经永久的改变了。绝大多数的Web API都不需要使用这类状态码。

  • 4xx:客户端错误

    • 406:Not acceptable,这表示API消费者请求的表述格式并不被Web API所支持,并且API不会提供默认的表述格式。例如请求的媒体类型是application/xml,但是Web API仅支持application/json类型,并且API不会将application/json作为默认格式提供;

    • 409:Conflict,表示请求与服务器当前状态冲突。通常指更新资源时发生的冲突,例如,当你编辑某个资源的时候,该资源在服务器上又进行了更新,所以你编辑的资源版本和服务器的不一致。当然有时候也用来表示你想要创建的资源在服务器上已经存在了。它就是用来处理并发问题的状态码。

    • 415:Unsupported media type,与406正好相反,有一些请求必须带着数据发往服务器,这些数据都属于特定的媒体类型,如果API不支持该媒体类型格式,415就会被返回。

    • 422:Unprocessable entity,它是HTTP扩展协议的一部分。它说明服务器已经懂得了实体的Content Type,也就是说415状态码肯定不合适;此外,实体的语法也没有问题,所以400也不合适。但是服务器仍然无法处理这个实体数据,这时就可以返回422。所以它通常是用来表示语意上有错误,通常就表示实体验证的错误。

  • 5xx:服务器错误

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

本篇重点关注状态码406和415,顺带看一下422。我们就类比爱情,对客户端与服务端交互的状态码进行解释。

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

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

  • 按*accept*头中的顺序枚举媒体类型

  • 尝试找到一个能生成*accept*中指定的格式之一的格式化器

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

  • 返回406 Not acceptable,只要需要设置如下:

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

2.1 其他策略

  • 尝试找到第一个可以生成响应的格式化程序:如果ASP.NET Core没有为所请求的格式配置格式化程序,则使用可以格式化该对象的第一个格式化程序.

如果请求没有Accept头:

  • 使用第一个可以处理对象的格式化器来响应序列化

  • 不执行任何协商,由ASP.NET Core决定返回的格式

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

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

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

  • 忽略Accept

  • 若为另行配置,将会使用JSON返回内容

3.Server:“你给的我不要”——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-不支持的媒体类型。

  • application/x-www-form-urlencoded,使用***[FromForm]***接收数据

  • application/json,使用***[FromBody]***接收数据

4.Server:“你给的,不是我想要的”——422

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

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

  • 服务器已经懂得了实体的Content Type的媒体类型,也就是说415状态码肯定不合适;

  • 此外,实体的语法也没有问题,所以400也不合适。

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

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

{"errors": {},"type": "https://tools.ietf.org/html/rfc7231#p-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#p-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#p-6.5.1","title": "One or more validation errors occurred.","status": 422,"detail": "","instance": "/api/admin/Sms","traceId": "0HM25M2D86T30:00000001"
}

长按二维码关注

点外卖,先领券

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

  1. HTTP: 状态码400~415错误说明

    状态码太多,记住几个常见得就好,还有就是记住不同数字开头,大致是哪方面出错,然后其他的就查好了 http_status_bad_request (400) the request could not ...

  2. http status 404 – 未找到_HTTP状态码

    200 - OK,服务器成功返回网页 Standard response for successful HTTP requests. 301 - Moved Permanently(永久跳转),请求的 ...

  3. Http 状态码详解

    状态码 含义 100 客户端应当继续发送请求.这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝.客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应.服务器必须在 ...

  4. HTTP状态码对照表(全部状态_建议收藏)

    HTTP状态码的分类 HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用.HTTP状态码共分为5种类型: 分类 分类描述 1** 信息,服务器收到请求,需 ...

  5. HTTP 状态码常用对照表

    转载地址:http://tool.oschina.net/commons?type=5 状态码 含义 100 客户端应当继续发送请求.这个临时响应是用来通知客户端它的部分已经被服务器接收,且仍未被拒绝 ...

  6. 常见的http状态码

    400 Bad Request 1.语义有误,当前请求无法被服务器理解.除非进行修改,否则客户端不应该重复提交这个请求. 2.请求参数有误. 401 Unauthorized 当前请求需要用户验证.该 ...

  7. 使用ASP.NET Core 3.x 构建 RESTful API - 3.3.1 HTTP状态码

    HTTP状态码会告诉API的消费者以下事情: 请求是否执行成功了 如果请求失败了,那么谁为它负责 HTTP的状态码有很多,但是Web API不一定需要支持所有的状态码.HTTP状态码一共分为5个级别: ...

  8. HTTP协议状态码详解

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 状态码 含义 100 客户端应当继续发送请求.这个临时响应是用来通知客户端它的部分请求已经被服务器接 ...

  9. python状态码409_HTTP状态码

    HTTP各种相应的状态码 HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码.它由 RFC 2616 规范定义的,并得到RFC 2518.RFC 28 ...

最新文章

  1. java字符存储_用java的类集框架做一个字符存储器(15)
  2. 【转】心目中的编程高手
  3. PostgreSQL 11 1Kw TPCC , 1亿 TPCB 7*24 强压耐久测试
  4. 阿里云云安全中心入选Gartner CWPP全球市场指南
  5. numpy.random模块常用函数
  6. C++socket编程(三):3.7 服务端回应send客户端数据
  7. Idea查看文件结构,类似Eclipse中Ctrl+O
  8. ora-28547 可能是oracle net 管理错误_PostgreSQL与Oracle:成本、易用性和功能上的差异...
  9. trivial/nontrival函数
  10. 农场周围的道路c语言编程,[蓝桥杯][2013年第四届真题]农场阳光 (C语言)
  11. Spark SQL PERCENTILE分析调研
  12. AUV运动控制仿真(PID控制)
  13. 电脑变时钟,防止消息游戏新闻的打扰,形成高效率的办公和学习
  14. 京东面试官:给我说说你简历上的订单系统是如何设计的?尽量详细点~
  15. 绝地求生 服务器无响应,绝地求生卡在登陆页面怎么办
  16. 参禅静坐--虚极静笃--快速恢复脑力体力
  17. 举个栗子!Tableau 技巧(176):快速添加 Server 受信任的 IP
  18. Android支付接入:Google In-app-Billing
  19. poi ppt 作者属性 修改_ppt文字属性-如何让PowerPoint里作者等信息不被修改自己辛辛苦苦做的工 爱问知识人...
  20. linux 32位中文版,Linux_Deepin_2014下载|Linux Deepin 2014.3 官方简体中文最新版(32位/64位) - 飞极下载站...

热门文章

  1. WPF DataGrid根据内容设置行颜色
  2. [function.require]: Failed opening required 杰奇cms
  3. Linux系统运维之路
  4. 移动web开发适配rem
  5. Linux中一些常用的很巧妙的命令
  6. css定位positon
  7. Java集合之LinkedList
  8. keil之编辑环境配置
  9. 【转】一个关于fork()的笔试题,考了好几遍,终于找到答案了
  10. 自定义异常最佳实践_播放,自定义和组织媒体的最佳文章