我又踩坑了!如何为HttpClient请求设置Content-Type标头?

本文转载自微信公众号「Dotnet Plus」,又踩作者小码甲 。坑何转载本文请联系Dotnet Plus公众号。请求设
最近在重构认证代码,又踩认证过程相当常规:
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"}
平台显示 :签名校验失败, 排查到平台收到的请求设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?坑何
明眼人一看,云南idc服务商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啊?

2. 爬坑
--- 信息 举例 .NET类型 General Header 可同时作用在请求/响应中,但是与传输数据无关 Upgrade、Connection --- Request Header 将要获取的资源或客户端本身的信息 Accept、
Authorization HttpRequestHeaders Response Header 响应信息 Location、ETag HttpResponseHeaders Entity
Header 实体Body额外的站群服务器信息 Content-Length、
Connection HttpContentHeadersContent-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") );相关文章
台式电脑内置喇叭安装教程(一步步教你如何给台式电脑安装内置喇叭)
摘要:随着科技的不断发展,电脑已经成为我们生活中不可或缺的一部分。而为了获得更好的音效体验,很多人选择给台式电脑安装内置喇叭。本文将详细介绍如何进行台式电脑内置喇叭的安装。1.选...2025-11-04零基础开发 Node.js Addons 插件:参数与返回值处理
本篇介绍使用 Node-API 为 Node.js 开发基于 C 的 Addons 时,如何接收与处理 Node.js 层传递的参数、Node-API 参数类型如何与 C 的类型2025-11-04
太强了!Python 开发桌面小工具,让代码替我们干重复的工作!
决定写这篇文章的初衷是来源于一位小伙伴的问题,关于"如何根据数据源用 Python 自动生成透视表",这个问题背后有个非常好的解决思路,让代码替我们做重复的工作,从而减轻工作量,减少出错。2025-11-04
1.物理读(physical read)物理读即是把数据从磁盘读入到buffer catch的过程。 通常情况下是,如果需要数据的时候发现不存在于buffer catch当中,即oracle就会执行物2025-11-04索尼KDL32R500C电视评测(探索索尼KDL32R500C的特点和性能)
摘要:索尼一直以来都是电子产品领域的顶尖品牌之一,其电视产品在市场上备受好评。本文将对索尼KDL32R500C电视进行评测,为大家详细介绍其特点和性能。一:外观设计——简约时尚...2025-11-04
在Oracle数据库中,CBO会默认目标列的数据在其最小值low_value和***值high_value之间均匀分布,并按照均匀分布原则,来计算目标列施加查询条件后的可选择率以及结果集的cardin2025-11-04

最新评论