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

最近在调试接口时,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://www.mzph.cn/news/305377.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

infor wms 项目启动_广汽本田增城工厂No.2L WMS项目正式启动

Warehouse导读:近日,在生管科No.2L办公室,广汽本田增城工厂No.2L WMS项目启动大会如期召开。生产管理科,IT科,FNL以及汉得信息有限公司的WMS项目组成员参加了本次启动大会。Management2018年10月,生管科已经…

mysql动态扩展_动态可扩展查询MYSQL5.7JSON+虚拟列+Mybatis

背景:现有业务扩展字段,都存在feature字段,存在语义不清晰以及,难以利用索引查询问题Mysql 5.7后推出利器,JSON虚拟列,即实现了业务语义统一,也支持索引查询加速一、简单描述MySQL 5.7.7 labs版…

asp.net core安全事项(中)

上传文件上传文件是造成风险的很大因素,所以对上传文件进行处理是重要的,首先要处理的是:a、上传文件大小限制;b、上传文件类型(能过扩展或,或文件头)限制;c、上传的名称要替换掉;d、上传的文件…

http referer 验证防御方法_渗透测试 跨站攻击防御与安全检测手法剖析

上一节讲到了渗透测试中xss跨站攻击检测方法和防护,这一节也是关于跨站攻击的另一个手法CSRF,很多客户找到我们想要了解更多的跨站攻击检测方法以及防御此类攻击的办法,想要让网站的安全性更加坚固,对此提醒大家渗透测试网站必须要拿到授权才能测试哦!3.…

如何手动连上mysql_如何手动安装MySql

想安装当然要先有一个MySql的安装包 这里使用的是mysql-5.7.12-winx64安装包百度云:http://pan.baidu.com/s/1kVAuXuv       密码:hr391.要将压缩包解压到你的指定位置(最好将要用的工具文件分类放好)例如:D:javaAppmysql-5.7.12-winx6…

WebRTC成为W3C和IETF正式标准

喜欢就关注我们吧!2021年1月26日,W3C(万维网联盟)和 IETF (互联网工程任务组)同时宣布 WebRTC(Web Real-Time Communications,Web 实时通信)现发布为正式标准&#xff0c…

mysql非安装_mysql 非安装版的配置

一直以来都是使用wamp中集成的mysql数据库,今天突然想试试下载一个mysql的zip包进行配置。一、下载mysql非安装版下载地址可以到:http://dev.mysql.com/downloads/mysql/ ,或者直接点击下载mysql-32bit:http://cdn.mysql.com/Down…

Xamarin.Forms: 无限滚动的ListView(懒加载方式)

说明 在本博客中,学习如何在Xamarin.Forms应用程序中设计一个可扩展的无限滚动的ListView。这个无限滚动函数在默认的Xamarin.Forms不存在,因此我们需要为此添加插件。在这里我们需要知道无限滚动时如何工作的。首先,显示固定的数据。一旦用户…

javaweb应用开发与实践pdf_基于阿里云打造「云原生」Web应用——「懒猪行」Web应用开发实践...

作者:阿里云MVP 刘远程背景『懒猪行』专注于境外自由行S2B业务,涉及分销、终端用户服务、供应链等多个服务环节,随着业务规模的不端增加,我们一直在探索Web应用开发的最佳实践,以加快Web应用的迭代效率,为B…

python大型项目中的日志模块_Python中日志模块的使用

前言程序和脚本往往是无人值守运行的,一旦发生问题,就需要我们去追溯当时的情况来定位问题的原因。这便需要我们在程序和脚本中引入日志的功能。相比于print信息,使用logging日志有以下优点可以记录输出日志的时间、文件、函数以及代码行&…

OSI强调:SSPL并不是开源许可证

喜欢就关注我们吧!日前,开放源代码促进会 OSI(Open Source Initiative)强调,SSPL 并不是一个开源许可证。OSI 表示,SSPL(Server Side Public License) 是一种典型的 “fauxpen”&…

.NET Remoting

轉自:http://www.iiiedu.org.tw/knowledge/knowledge20030430_2.htm.NET Remoting 資策會數位教育研究所講師 董淑惠     概念簡介 微軟以往使用COM/DCOM的技術來處理分散式系統架構,透過Client端的Proxy代理程式來呼叫遠端Server機器上的物件。.NET Framework則…

通过python实现linux切换用户_Python操作远程服务器切换到root用户

在自动化运维过程中,需要远程服务器切换到root用户下执行命令,尝试了一些方法,得到如下好用的方法,供大家使用: import time import paramiko def verification_ssh(host,username,password,port,root_pwd,cmd): spara…

RabbitMQ 入门:1. Message Broker(消息代理)

Message Broker(消息代理)维基百科对 Message Broker 的定义是:Message broker是一种中介程序模块,它把消息从发送方的正式消息传递协议转化为接收方的正式消息传递协议。这个定义略繁琐,下面看看 RabbitMQ 官网对 Mes…

什么时候我们应谈及性能?

【导读】实际项目开发中、有部分童鞋可能无时无刻都在关注性能,那么我们到底应该什么时候关注性能呢?个人以为,性能并非一次性就可完全成全,需结合实际业务有一个大致评估或预期,比如数据量大小,若预期短暂…

python编写正则表达式匹配单词_Python正则表达式匹配整个单词

守候你守候我 我认为,通过给出的答案,OP所期望的行为并没有完全实现。具体来说,布尔值的期望输出没有完成。给出的答案做帮助说明这一概念,我认为他们是优秀的。也许我可以说明我的意思,我认为OP使用了下面的例子。给出…

python中可以表示任意大的整数_Python无法表示99999999999999999999这样大的整数。

被邓为“小平和国一部意义义的具有际意称赞法律历史,无法”的性的一个具有杰作创造“是是(。表示。对于的容性要密封求高器,样整数包括性试验的要求中应进行气密各种。无法喷涂金属及工具有设备。吊装台起用多重机设备时,表示为(吊装用的常采…

[转]简单介绍如何用Reporting Service制作报表

1) 在安装好Reporting Service后,打开Visual studio .net ,选择新建项目,选择建立商业智能项目,选择新建一个报表项目,命名为reportservice1,再选确定,如下图: 2)之后,在…

freertos源码详解与应用开发 pdf_互联网企业面试必问Spring源码?搞定Spring源码,看完这篇就够了...

不用说,Spring已经成为Java后端开发的事实上的行业标准。无数公司选择Spring作为基本开发框架。大多数Java后端程序员在日常工作中也会接触到Spring。因此,如何很好地使用Spring,已成为Java程序员的必修课之一。同时,Spring Boot和…

MS-SQLSERVER--错用了LEN()函数

sqlserver数据导入oracle时发现字符长度不对。。下面是两个函数的区别:DATALENGTH 返回任何表达式所占用的字节数。LEN 返回给定字符串表达式的字符(而不是字节)个数,其中不包含尾随空格转载于:https://www.cnblogs.com/yooplmqj/…