日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2023/12/4 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Http】一文备忘Http状态码(406,415,422) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最近在調(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è)置如下:

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

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。