自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

我又踩坑了!如何為HttpClient請(qǐng)求設(shè)置Content-Type標(biāo)頭?

開(kāi)發(fā) 前端
平臺(tái)顯示 :簽名校驗(yàn)失敗, 排查到平臺(tái)收到的Post Payload并非預(yù)期,閱讀本文,解鎖正確使用Content-Type標(biāo)頭的姿勢(shì)。

[[344474]]

本文轉(zhuǎn)載自微信公眾號(hào)「Dotnet Plus」,作者小碼甲 。轉(zhuǎn)載本文請(qǐng)聯(lián)系Dotnet Plus公眾號(hào)。   

最近在重構(gòu)認(rèn)證代碼,認(rèn)證過(guò)程相當(dāng)常規(guī):

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

 

平臺(tái)顯示 :簽名校驗(yàn)失敗, 排查到平臺(tái)收到的Post Payload并非預(yù)期,閱讀本文,解鎖正確使用Content-Type標(biāo)頭的姿勢(shì)。

1. 入坑

下面是構(gòu)造HttpClient對(duì)象、發(fā)起請(qǐng)求的代碼:

  1. // 初始化HttpClientFactory 
  2. context.Services.AddHttpClient("platform", c => 
  3.     c.BaseAddress = new Uri("https://alpha-engage.demohost.com/"); 
  4.     c.DefaultRequestHeaders.Accept 
  5.     .Add(new MediaTypeWithQualityHeaderValue("application/json")); 
  6. })... 
  7.  
  8. // 產(chǎn)生命名HttpClient,發(fā)起請(qǐng)求 
  9.  var client = _clientFactory.CreateClient("platform"); 
  10.  var response = await client.PostAsync($"open-api/v1/user-token/info?{req.AuthString()}",new StringContent(req.ReqPayload.ToString(),Encoding.UTF8) ); 

平臺(tái)日志顯示,收到的請(qǐng)求payload:

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

額,平臺(tái)收到的JSON數(shù)據(jù)被轉(zhuǎn)碼了,沒(méi)有識(shí)別出JSON?

明眼人一看,HttpClient請(qǐng)求沒(méi)有設(shè)置Content-Type,接收端沒(méi)有識(shí)別出JSON 格式的payload , 進(jìn)行了轉(zhuǎn)碼,生成了錯(cuò)誤簽名。

① Content-Type是一個(gè)Entity Header,指示資源的mediaType ,可用在請(qǐng)求/響應(yīng)中

② 代碼中new StringContent(req.ReqPayload.ToString(),Encoding.UTF8) 沒(méi)有指定mediaType參數(shù),故函數(shù)會(huì)使用text/plain默認(rèn)值

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

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

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

此時(shí)拋出以下異常:

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

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

 

2. 爬坑

--- 信息 舉例 .NET類(lèi)型
General Header 可同時(shí)作用在請(qǐng)求/響應(yīng)中,但是與傳輸數(shù)據(jù)無(wú)關(guān) Upgrade、Connection ---
Request Header 將要獲取的資源或客戶(hù)端本身的信息 Accept、
Authorization
HttpRequestHeaders
Response Header 響應(yīng)信息 Location、ETag HttpResponseHeaders
Entity
Header
實(shí)體Body額外的信息 Content-Length、
Connection
HttpContentHeaders

Content-Type屬于Entity Header的一種,對(duì)應(yīng).NET類(lèi)型 HttpContent Header;

雖然Entity Header不是請(qǐng)求標(biāo)頭也不是響應(yīng)標(biāo)頭,它們還是會(huì)包含在請(qǐng)求/響應(yīng)標(biāo)頭術(shù)語(yǔ)中(此說(shuō)法來(lái)自官方)。

所以我們?cè)贑hrome DevTools沒(méi)有看到Entity Headers分組, 卻常在請(qǐng)求/響應(yīng)標(biāo)頭中看到Content-Type標(biāo)頭。

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

3. 填坑

給這個(gè)常規(guī)的Post請(qǐng)求設(shè)置正確的Content-Type標(biāo)頭。

方法① 對(duì)HttpRequestMessage對(duì)象Content屬性添加Header

  1.  using (var request = new HttpRequestMessage()) 
  2.      request.Method = new HttpMethod(method); 
  3.      request.RequestUri = new Uri(url); 
  4.      request.Content = new StringContent(payload); 
  5.      request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); 
  6.      var response = await _httpClient.SendAsync(request); 
  7.      return response; 

使用HttpClient.SendAsync(request)

方法② 寫(xiě)入HttpContent時(shí)傳入媒體類(lèi)型

StringContent某個(gè)重載構(gòu)造函數(shù) : 參數(shù)3 可直接設(shè)置media type,

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

 

責(zé)任編輯:武曉燕 來(lái)源: Dotnet Plus
相關(guān)推薦

2022-11-18 07:34:12

Docker項(xiàng)目目錄

2024-04-10 08:39:56

BigDecimal浮點(diǎn)數(shù)二進(jìn)制

2021-09-09 18:12:22

內(nèi)存分段式網(wǎng)絡(luò)

2023-03-06 07:50:19

內(nèi)存回收Go

2020-09-06 10:02:32

項(xiàng)目管理戰(zhàn)略目標(biāo)CIO

2020-03-31 16:02:23

戴爾

2024-05-06 00:00:00

緩存高并發(fā)數(shù)據(jù)

2022-11-27 17:21:04

ClickHouseJDBC函數(shù)

2020-04-14 10:06:20

微服務(wù)Netflix語(yǔ)言

2019-10-30 14:44:41

Prometheus開(kāi)源監(jiān)控系統(tǒng)

2025-02-18 15:17:59

2021-07-28 05:01:29

Lombok前端測(cè)試

2024-11-20 18:16:39

MyBatis批量操作數(shù)據(jù)庫(kù)

2020-12-22 09:34:20

JavaScript開(kāi)發(fā)技術(shù)

2020-09-15 08:46:26

Kubernetes探針服務(wù)端

2023-01-18 23:20:25

編程開(kāi)發(fā)

2022-12-07 15:37:32

參數(shù)不定參數(shù)

2023-05-15 20:11:34

2017-05-05 08:12:51

Spark共享變量

2021-10-28 19:10:02

Go語(yǔ)言編碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)