成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

我又踩坑了!如何為HttpClient請求設置Content-Type標頭?

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

[[344474]]

本文轉載自微信公眾號「Dotnet Plus」,作者小碼甲 。轉載本文請聯系Dotnet Plus公眾號。   

最近在重構認證代碼,認證過程相當常規:

  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"

 

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

1. 入坑

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

  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. // 產生命名HttpClient,發起請求 
  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) ); 

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

  1. {\"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時(下面黃色背景行代碼):

  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. }) 

此時拋出以下異常:

  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類型
General Header 可同時作用在請求/響應中,但是與傳輸數據無關 Upgrade、Connection ---
Request Header 將要獲取的資源或客戶端本身的信息 Accept、
Authorization
HttpRequestHeaders
Response Header 響應信息 Location、ETag HttpResponseHeaders
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

  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)

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

StringContent某個重載構造函數 : 參數3 可直接設置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") ); 

 

責任編輯:武曉燕 來源: Dotnet Plus
相關推薦

2022-11-18 07:34:12

Docker項目目錄

2021-09-09 18:12:22

內存分段式網絡

2024-04-10 08:39:56

BigDecimal浮點數二進制

2023-03-06 07:50:19

內存回收Go

2020-09-06 10:02:32

項目管理戰略目標CIO

2020-03-31 16:02:23

戴爾

2025-05-27 01:55:00

MySQL數據庫工具鏈

2024-05-06 00:00:00

緩存高并發數據

2022-11-27 17:21:04

ClickHouseJDBC函數

2020-04-14 10:06:20

微服務Netflix語言

2019-10-30 14:44:41

Prometheus開源監控系統

2025-02-18 15:17:59

2021-07-28 05:01:29

Lombok前端測試

2024-11-20 18:16:39

MyBatis批量操作數據庫

2020-12-22 09:34:20

JavaScript開發技術

2022-12-07 15:37:32

參數不定參數

2020-09-15 08:46:26

Kubernetes探針服務端

2023-01-18 23:20:25

編程開發

2011-08-31 08:41:07

Java高斯林

2023-05-15 20:11:34

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日本中文在线 | 国产亚洲一区二区三区 | 国产精品久久久久久 | 99资源| 黄色中文字幕 | 日韩一区二区三区在线观看视频 | 国产在线一区二 | 可以免费看的毛片 | 天天碰夜夜操 | 中文字幕1区2区 | 中文在线一区二区 | 一区二区三区福利视频 | 黑人精品| 91精品国产综合久久久久久 | 久久久久久国产精品免费免费狐狸 | 国产精品一区二区视频 | 久久精品国产99国产 | 美女啪啪国产 | 最新国产精品视频 | 日韩成人精品一区 | 久久久.com| 成人欧美一区二区三区黑人孕妇 | 国产一区二区精品在线 | 国产精品自拍一区 | 四虎永久在线精品免费一区二 | 自拍视频一区二区三区 | 羞羞涩涩在线观看 | 久久99精品久久久久久 | 亚洲精品久久 | 精品国产一区二区三区久久狼黑人 | 一级毛片观看 | 久久国产精品免费视频 | 国产精品18hdxxxⅹ在线 | 精品一区二区三区四区外站 | 97精品超碰一区二区三区 | 亚洲精品888| 91传媒在线观看 | 久久国产欧美日韩精品 | 激情福利视频 | 亚洲视频免费在线 | 日韩成人|