【Http】一文备忘Http状态码(406,415,422)
最近在調(diào)試接口時(shí),web api 報(bào)了一個(gè)415狀態(tài)碼。好久沒(méi)見(jiàn)到這個(gè)狀態(tài)碼,一時(shí)還真不知道啥情況。所以,人的大腦是有遺忘規(guī)律的,為了加深印象,所以我覺(jué)得我有必要再?gòu)?fù)習(xí)一下。
1.HTTP的狀態(tài)碼
首先復(fù)習(xí)一下所有的狀態(tài)碼。
1xx:屬于信息性的狀態(tài)碼。Web API并不使用1xx的狀態(tài)碼。
2xx:意味著請(qǐng)求執(zhí)行的很成功。
3xx:用于跳轉(zhuǎn)。例如告訴搜素引擎,某個(gè)頁(yè)面的網(wǎng)址已經(jīng)永久的改變了。絕大多數(shù)的Web API都不需要使用這類(lèi)狀態(tài)碼。
4xx:客戶端錯(cuò)誤
406:Not acceptable,這表示API消費(fèi)者請(qǐng)求的表述格式并不被Web API所支持,并且API不會(huì)提供默認(rèn)的表述格式。例如請(qǐng)求的媒體類(lèi)型是application/xml,但是Web API僅支持application/json類(lèi)型,并且API不會(huì)將application/json作為默認(rèn)格式提供;
409:Conflict,表示請(qǐng)求與服務(wù)器當(dāng)前狀態(tài)沖突。通常指更新資源時(shí)發(fā)生的沖突,例如,當(dāng)你編輯某個(gè)資源的時(shí)候,該資源在服務(wù)器上又進(jìn)行了更新,所以你編輯的資源版本和服務(wù)器的不一致。當(dāng)然有時(shí)候也用來(lái)表示你想要?jiǎng)?chuàng)建的資源在服務(wù)器上已經(jīng)存在了。它就是用來(lái)處理并發(fā)問(wèn)題的狀態(tài)碼。
415:Unsupported media type,與406正好相反,有一些請(qǐng)求必須帶著數(shù)據(jù)發(fā)往服務(wù)器,這些數(shù)據(jù)都屬于特定的媒體類(lèi)型,如果API不支持該媒體類(lèi)型格式,415就會(huì)被返回。
422:Unprocessable entity,它是HTTP擴(kuò)展協(xié)議的一部分。它說(shuō)明服務(wù)器已經(jīng)懂得了實(shí)體的Content Type,也就是說(shuō)415狀態(tài)碼肯定不合適;此外,實(shí)體的語(yǔ)法也沒(méi)有問(wèn)題,所以400也不合適。但是服務(wù)器仍然無(wú)法處理這個(gè)實(shí)體數(shù)據(jù),這時(shí)就可以返回422。所以它通常是用來(lái)表示語(yǔ)意上有錯(cuò)誤,通常就表示實(shí)體驗(yàn)證的錯(cuò)誤。
5xx:服務(wù)器錯(cuò)誤
——摘自楊旭老師B站視頻。
本篇重點(diǎn)關(guān)注狀態(tài)碼406和415,順帶看一下422。我們就類(lèi)比愛(ài)情,對(duì)客戶端與服務(wù)端交互的狀態(tài)碼進(jìn)行解釋。
2.Server:”你要的我給不了“——406
在http請(qǐng)求中,會(huì)在Accept表明客戶端希望接收的數(shù)據(jù)類(lèi)型。當(dāng)請(qǐng)求包含*accept頭,在ASP.NET Core*框架中,將會(huì):
按*accept*頭中的順序枚舉媒體類(lèi)型
嘗試找到一個(gè)能生成*accept*中指定的格式之一的格式化器
找到了,就還罷了,一旦找不到格式化器,ASP.NET Core將會(huì):
返回406 Not acceptable,只要需要設(shè)置如下:
2.1 其他策略
嘗試找到第一個(gè)可以生成響應(yīng)的格式化程序:如果ASP.NET Core沒(méi)有為所請(qǐng)求的格式配置格式化程序,則使用可以格式化該對(duì)象的第一個(gè)格式化程序.
如果請(qǐng)求沒(méi)有Accept頭:
使用第一個(gè)可以處理對(duì)象的格式化器來(lái)響應(yīng)序列化
不執(zhí)行任何協(xié)商,由ASP.NET Core決定返回的格式
Accept: */*,..,..,如果Accept 包含*/*,那么就會(huì)忽略Accept,除非做如下配置:
public?void?ConfigureServices(IServiceCollection?services) {services.AddControllers(options?=>{options.RespectBrowserAcceptHeader?=?true;?//?false?by?default}); }這樣,在使用 API 時(shí),與在瀏覽器中的體驗(yàn)一致:
忽略Accept
若為另行配置,將會(huì)使用JSON返回內(nèi)容
3.Server:“你給的我不要”——415
說(shuō)回我們問(wèn)題的初衷,報(bào)了415,我這邊ajax設(shè)置的Content-Type:application/x-www-form-urlencoded,然后asp.net core返回了415.
在HTTP中,Content-Type代表客戶端發(fā)送的實(shí)體數(shù)據(jù)的數(shù)據(jù)類(lèi)型,如果客戶端是以*application/x-www-form-urlencoded*** ,在asp.net core中用***[FromBody]*接收,服務(wù)端api是不會(huì)接收數(shù)據(jù),便會(huì)返回415 Unsupported Media Type-不支持的媒體類(lèi)型。
application/x-www-form-urlencoded,使用***[FromForm]***接收數(shù)據(jù)
application/json,使用***[FromBody]***接收數(shù)據(jù)
4.Server:“你給的,不是我想要的”——422
順帶提一下并不常用,但是卻非常有用的狀態(tài)碼——422。
422:Unprocessable entity,它是HTTP擴(kuò)展協(xié)議的一部分。
服務(wù)器已經(jīng)懂得了實(shí)體的Content Type的媒體類(lèi)型,也就是說(shuō)415狀態(tài)碼肯定不合適;
此外,實(shí)體的語(yǔ)法也沒(méi)有問(wèn)題,所以400也不合適。
但是服務(wù)器仍然無(wú)法處理這個(gè)實(shí)體數(shù)據(jù),這時(shí)就可以返回422。所以它通常是用來(lái)表示語(yǔ)意上有錯(cuò)誤,或者不符合接口要求的數(shù)據(jù),通常就表示實(shí)體驗(yàn)證的錯(cuò)誤。對(duì)于實(shí)體模型驗(yàn)證錯(cuò)誤:
*ASP.NET Core*默認(rèn)使用的是400狀態(tài)碼-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會(huì)更準(zhǔn)確的說(shuō)明是實(shí)體數(shù)據(jù)問(wèn)題。如果想要服務(wù)端返回422,還需要做單獨(dú)配置,詳細(xì)配置如下:
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" } 長(zhǎng)按二維碼關(guān)注點(diǎn)外賣(mài),先領(lǐng)券總結(jié)
以上是生活随笔為你收集整理的【Http】一文备忘Http状态码(406,415,422)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 盘点大厂的那些开源项目 - 华为
- 下一篇: WebRTC成为W3C和IETF正式标准