网易首页 > 网易号 > 正文 申请入驻

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

0
分享至

作者 | 小码甲

来源 | Dotnet Plus (ID :nodotnet)

头图 | CSDN 下载自东方IC

最近在重构认证代码,认证过程相当常规:

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 标头的姿势。

入坑

下面是构造 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.

爬坑

官方资料显示:HTTP Headers 被分为如下四类:

--- 信息 举例
.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

填坑

给这个常规的 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. 小编对于 Http 协议有知识漏洞,搬砖时一直关注 Chrome DevTools,忽略了还有 Entity Header 一说。

  2. Content-Type 这个实体标头,会出现了请求/响应标头,指示资源的媒体类型。

  3. .NTE 针对4种 HTTP Header 强化了区别,在实际开发中要区别使用。

  • https://tools.ietf.org/html/rfc2616#page-41

  • https://developer.mozilla.org/en-US/docs/Glossary/Entity_header

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
好莱坞种马查理:疯狂的和陌生人发生关系,连男人都不放过

好莱坞种马查理:疯狂的和陌生人发生关系,连男人都不放过

七阿姨爱八卦
2026-05-16 16:05:36
1夜7大转会!曼联第二签,阿莱格里执教那不勒斯,B席加盟巴萨!

1夜7大转会!曼联第二签,阿莱格里执教那不勒斯,B席加盟巴萨!

田先生篮球
2026-05-30 09:35:25
大数据扫黄有多可怕?这几人早已被后台锁定,看完一身冷汗

大数据扫黄有多可怕?这几人早已被后台锁定,看完一身冷汗

呼呼历史论
2026-05-30 10:35:16
生了4个儿子,因太穷送出两个,谁知四个儿子后来都成了亿万富翁

生了4个儿子,因太穷送出两个,谁知四个儿子后来都成了亿万富翁

兴趣知识
2026-05-30 18:51:30
伊朗称对霍尔木兹海峡航运实施全面管理

伊朗称对霍尔木兹海峡航运实施全面管理

澎湃新闻
2026-05-31 03:04:01
几家欢喜几家愁!中超一夜两极分化,强队集体踩刹车

几家欢喜几家愁!中超一夜两极分化,强队集体踩刹车

天光破云来
2026-05-31 06:49:33
黄圣依直播被贾乃亮刷屏,杨子怒砸10万当榜一,黄圣依冷漠回应

黄圣依直播被贾乃亮刷屏,杨子怒砸10万当榜一,黄圣依冷漠回应

美芽
2026-05-30 18:03:56
除毛岸英外,还有3位“高干子弟”入朝作战,各自结局如何?

除毛岸英外,还有3位“高干子弟”入朝作战,各自结局如何?

古今闲谈
2026-05-31 05:37:14
62岁的我狠心戒烟戒酒一年,复查时医生一番话,让我彻底醒悟

62岁的我狠心戒烟戒酒一年,复查时医生一番话,让我彻底醒悟

千秋文化
2026-03-01 22:14:37
中美日一季度GDP差距断崖,美国7.32万亿,日本1.02万亿

中美日一季度GDP差距断崖,美国7.32万亿,日本1.02万亿

又是美好的日子
2026-05-27 22:56:03
不充电不加油!全新理想L9零补能京沪挑战成功:总里程1422.8km油耗仅6L

不充电不加油!全新理想L9零补能京沪挑战成功:总里程1422.8km油耗仅6L

快科技
2026-05-29 10:45:25
法网女单太乱了:随着姆博科1-2出局,世界前十已有6将被送回家

法网女单太乱了:随着姆博科1-2出局,世界前十已有6将被送回家

侧身凌空斩
2026-05-31 03:56:40
全固态电池装车!续航1000km成本1元/Wh,千万新能源车主成韭菜?

全固态电池装车!续航1000km成本1元/Wh,千万新能源车主成韭菜?

胖福的小木屋
2026-05-29 12:11:34
“暴力丑学”,正批量毁掉中国景区

“暴力丑学”,正批量毁掉中国景区

一刻talks丨硬科技趣思想
2026-05-27 21:07:13
陈文茜公开评价说马英九对台湾对国民党的危害,十倍百倍于李登辉

陈文茜公开评价说马英九对台湾对国民党的危害,十倍百倍于李登辉

安安说
2026-05-30 12:25:49
女宇航员在太空,怎么解决生理需求?怎么保护隐私?了解下

女宇航员在太空,怎么解决生理需求?怎么保护隐私?了解下

小谈食刻美食
2026-05-12 07:59:18
黑哨单丹奥再次1/2哨吹死泰山队,拜合拉木逃红,宿茂臻吃到黄牌

黑哨单丹奥再次1/2哨吹死泰山队,拜合拉木逃红,宿茂臻吃到黄牌

呀古铜
2026-05-31 00:18:52
“说着说着,他的手就趁你不注意,他手就捞过来,就很熟练。”武汉女子称报案维权反遭猥亵,多次向相关部门举报、报警

“说着说着,他的手就趁你不注意,他手就捞过来,就很熟练。”武汉女子称报案维权反遭猥亵,多次向相关部门举报、报警

都市快报橙柿互动
2026-05-30 08:18:51
遗憾 张雪与数万名球迷一同观战德比斯:未能见证第6冠 尾速上不去

遗憾 张雪与数万名球迷一同观战德比斯:未能见证第6冠 尾速上不去

风过乡
2026-05-30 19:32:22
黄仁勋台北遇6万香奈儿包,随手签名尽显富人日常

黄仁勋台北遇6万香奈儿包,随手签名尽显富人日常

小陆搞笑日常
2026-05-30 20:39:08
2026-05-31 07:39:00
CSDN incentive-icons
CSDN
成就一亿技术人
26594文章数 242292关注度
往期回顾 全部

科技要闻

车圈大佬发声:价格战远去,但竞争仍残酷

头条要闻

两名9岁女孩被困电梯近2小时 求救几十次物业无动于衷

头条要闻

两名9岁女孩被困电梯近2小时 求救几十次物业无动于衷

体育要闻

巴黎再度捧起欧冠奖杯 枪手众将黯然神伤

娱乐要闻

张碧晨《歌手》 “活人微死” 自嘲

财经要闻

双汇管不住一头猪

汽车要闻

900V+3.2秒破百 领克10+&领克10上市16.99万元起

态度原创

时尚
艺术
数码
旅游
本地

美回巅峰的她们,带火的这些爆款真的好用吗

艺术要闻

我想有个小院,从此荒度余生

数码要闻

vivo S60系列发布:2899元起 推出4K原生感Live

旅游要闻

六一去哪玩?全国景区免票大放送,家长也能免费玩!

本地新闻

用剪纸的方式,打开江苏扬州

无障碍浏览 进入关怀版