使用HttpClient调用内部第三方API时移除请求头分号后的空格
如何移除HTTP请求头中charset前的空格以适配第三方API?
嘿,这个问题我太懂了——有时候那些不起眼的格式细节真能让API调用功亏一篑!第三方API对请求头的格式要求格外严格,不允许charset前出现空格,但.NET的默认API会自动加上这个空格,咱们来搞定它。
问题根源
你用的MediaTypeWithQualityHeaderValue和StringContent在生成请求头时,会自动在分号;和charset之间插入空格,这就导致请求头变成了application/json; charset=iso-8859-1,而不是API要求的application/json;charset=iso-8859-1,自然会触发“无效头值”的错误。
解决方案
我们需要绕过.NET的自动格式化逻辑,手动生成符合要求的请求头:
1. 处理Accept头
不要使用MediaTypeWithQualityHeaderValue来构建Accept头,直接以字符串形式添加:
// 替换原来的Accept头添加代码 request.Headers.Add("Accept", "application/json;charset=iso-8859-1");
2. 处理Content-Type头
StringContent的构造函数会自动生成带空格的Content-Type头,我们可以手动覆盖它的ContentType属性:
var isoEncoding = Encoding.GetEncoding("iso-8859-1"); var payload = new StringContent(JsonConvert.SerializeObject(body), isoEncoding); // 手动设置严格格式的Content-Type payload.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json;charset=iso-8859-1");
修改后的完整代码
public async Task<bool> CreateOrDeleteFolder(CreateFolderRequestBody body) { var request = new HttpRequestMessage(HttpMethod.Post, $"{BaseAddress}/testFolder.php"); // 直接添加无空格的Accept头 request.Headers.Add("Accept", "application/json;charset=iso-8859-1"); var isoEncoding = Encoding.GetEncoding("iso-8859-1"); var payload = new StringContent(JsonConvert.SerializeObject(body), isoEncoding); // 手动指定符合要求的Content-Type payload.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json;charset=iso-8859-1"); request.Content = payload; var responseMessage = await _client.SendAsync(request); responseMessage.EnsureSuccessStatusCode(); var responseBody = await responseMessage.Content.ReadAsStringAsync(); // 这里处理你的响应逻辑 return true; }
这样修改后,生成的请求头就会严格匹配API要求的格式,不会再出现多余的空格啦。
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

