成人免费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高斯林

2020-10-22 09:09:41

Python數據科學代碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 9久久 | 亚洲国产成人精品女人久久久 | 欧美一区在线视频 | 欧美日韩在线一区二区三区 | 中文字幕在线视频观看 | 久久精品视频在线观看 | 亚洲一卡二卡 | 色综合久 | 久草.com | 就操在线 | 中文字幕亚洲免费 | 精品香蕉一区二区三区 | 日韩伦理一区二区 | 日韩一级精品视频在线观看 | 成人精品久久日伦片大全免费 | 国产伦一区二区三区四区 | 99视频在线免费观看 | 亚洲精品专区 | 久久亚洲国产 | 国产精品视频网址 | www.天天操.com| 欧美aaaaaaaaaa | 久久一起草 | 国产在线视频在线观看 | 亚洲综合大片69999 | 日韩av中文 | 日韩精品在线一区二区 | 在线中文字幕视频 | 天天色天天射天天干 | 久久国产欧美日韩精品 | 91精品国产综合久久久久久首页 | 久久国产精品偷 | 美女国产一区 | 欧美日韩国产高清 | 奇米影视77| 午夜免费视频观看 | 91精品久久久久久久久中文字幕 | 国产精品久久久久久一区二区三区 | 日韩欧美在线视频 | 久久草视频 | 亚洲精品一级 |