中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

HttpClient請求中怎么設置Content-Type標頭

發布時間:2021-07-27 14:14:15 來源:億速云 閱讀:700 作者:Leah 欄目:web開發

本篇文章給大家分享的是有關HttpClient請求中怎么設置Content-Type標頭,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

POST   /open-api/v1/user-info?client_id&timstamp&rd=12345&sign=***&method=hmac content-type: application/json payload: { "token":"AA2917B0-C23D-40AB-A43A-4C4B61CC7C74"}

HttpClient請求中怎么設置Content-Type標頭

平臺顯示 :簽名校驗失敗, 排查到平臺收到的Post Payload并非預期,閱讀本文,解鎖正確使用Content-Type標頭的姿勢。

1. 入坑

下面是構造HttpClient對象、發起請求的代碼:

// 初始化HttpClientFactory context.Services.AddHttpClient("platform", c => {     c.BaseAddress = new Uri("https://alpha-engage.demohost.com/");     c.DefaultRequestHeaders.Accept     .Add(new MediaTypeWithQualityHeaderValue("application/json")); })...  // 產生命名HttpClient,發起請求  var client = _clientFactory.CreateClient("platform");  var response = await client.PostAsync($"open-api/v1/user-token/info?{req.AuthString()}",new StringContent(req.ReqPayload.ToString(),Encoding.UTF8) );

平臺日志顯示,收到的請求payload:

{\"token\":\"AA2917B0-C23D-40AB-A43A-4C4B61CC7C74\"}

額,平臺收到的JSON數據被轉碼了,沒有識別出JSON?

明眼人一看,HttpClient請求沒有設置Content-Type,接收端沒有識別出JSON 格式的payload ,  進行了轉碼,生成了錯誤簽名。

① Content-Type是一個Entity Header,指示資源的mediaType ,可用在請求/響應中

② 代碼中new StringContent(req.ReqPayload.ToString(),Encoding.UTF8)  沒有指定mediaType參數,故函數會使用text/plain默認值

------------------------------------------

當我嘗試添加Content-Type時(下面黃色背景行代碼):

context.Services.AddHttpClient("platform", c => {     c.BaseAddress = new Uri("https://alpha-engage.demohost.com/");     c.DefaultRequestHeaders.Accept          .Add(new MediaTypeWithQualityHeaderValue("application/json"));//ACCEPT header     c.DefaultRequestHeaders.Add("content-type", "application/json"); })

此時拋出以下異常:

InvalidOperationException: Misused header name. Make sure request headers are used with HttpRequestMessage, response headers with HttpResponseMessage, and content headers with HttpContent objects.

納尼,HttpContent Headers是啥?Chrome dev tools顯示只有兩種Header啊?

HttpClient請求中怎么設置Content-Type標頭

2. 爬坑

---信息舉例.NET類型
General Header可同時作用在請求/響應中,但是與傳輸數據無關Upgrade、Connection---
Request Header將要獲取的資源或客戶端本身的信息Accept、
Authorization
HttpRequestHeaders
Response Header響應信息Location、ETagHttpResponseHeaders
Entity
Header
實體Body額外的信息Content-Length、
Connection
HttpContentHeaders

Content-Type屬于Entity Header的一種,對應.NET類型 HttpContent Header;

雖然Entity Header不是請求標頭也不是響應標頭,它們還是會包含在請求/響應標頭術語中(此說法來自官方)。

所以我們在Chrome DevTools沒有看到Entity Headers分組, 卻常在請求/響應標頭中看到Content-Type標頭。

回到上面的異常,.NET 嚴格區分四種標頭,所以c.DefaultRequestHeaders.Add("content-type",  "application/json")  嘗試將content-type添加到請求頭,姿勢不正確,.NET提示InvalidOperationException。

3. 填坑

給這個常規的Post請求設置正確的Content-Type標頭。

方法① 對HttpRequestMessage對象Content屬性添加Header

 using (var request = new HttpRequestMessage()) {      request.Method = new HttpMethod(method);      request.RequestUri = new Uri(url);      request.Content = new StringContent(payload);      request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");      var response = await _httpClient.SendAsync(request);      return response; }

使用HttpClient.SendAsync(request)

方法② 寫入HttpContent時傳入媒體類型

StringContent某個重載構造函數 : 參數3 可直接設置media type,

var response = await client.PostAsync($"open-api/v1/user-token/info?{req.AuthString()}",new StringContent(req.ReqPayload.ToString(),Encoding.UTF8,"application/json") );

以上就是HttpClient請求中怎么設置Content-Type標頭,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

巴彦淖尔市| 丰台区| 许昌县| 田阳县| 永平县| 永新县| 临漳县| 河源市| 滁州市| 宣恩县| 勐海县| 宁武县| 慈利县| 清涧县| 博乐市| 体育| 塔河县| 嘉祥县| 甘孜县| 陵水| 原平市| 万荣县| 凤山市| 库尔勒市| 乌恰县| 黄大仙区| 视频| 保定市| 称多县| 旬阳县| 北海市| 中阳县| 云龙县| 柳河县| 禄丰县| 固阳县| 茂名市| 阿图什市| 永定县| 曲水县| 耿马|