C#使用HttpClient发POST请求如何强制Content-Type仅为application/json
解决方案
你遇到的问题是因为只要在StringContent构造函数中传入了编码参数,框架就会自动在Content-Type头后追加charset后缀,不管传入的是Default、UTF8还是其他编码都会触发该逻辑,和你使用同步Send还是异步SendAsync发送请求无关。
你可以选择以下任意一种方式修改即可实现纯application/json的Content-Type头:
方案1:创建StringContent后手动覆盖ContentType
构造StringContent时不传入编码和媒体类型参数,之后直接给ContentType赋值未指定CharSet的MediaTypeHeaderValue:
var httpClientHandler = new HttpClientHandler(); httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, sslPolicyErrors) => { return true; }; var client = new HttpClient(httpClientHandler); var webRequest = new HttpRequestMessage(HttpMethod.Post, base_url + url) { // 构造时不指定编码和媒体类型 Content = new StringContent(body) }; // 手动设置ContentType,不会自动追加charset webRequest.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json"); webRequest.Headers.Authorization = new AuthenticationHeaderValue("Bearer", apitoken); webRequest.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); Console.WriteLine(webRequest.RequestUri); Console.WriteLine(webRequest.Headers.ToString()); var response = client.Send(webRequest);
方案2:手动清空CharSet属性
如果需要保留编码设置,可以在创建StringContent后手动将ContentType的CharSet属性设为null:
var content = new StringContent(body, Encoding.UTF8, "application/json"); // 移除charset后缀 content.Headers.ContentType.CharSet = null; webRequest.Content = content;
两种方案都可以完全移除Content-Type头中的charset参数,满足接口要求。
内容的提问来源于stack exchange,提问作者Meerfall the dewott
相关产品推荐
相关产品推荐

