RestSharp转HttpClient代码遇400(ParseError)错误,求技术帮助
问题:RestSharp转HttpClient后返回400(ParseError)
原RestSharp实现代码:
var client = new RestClient("http://10.0.0.244:8885/terminal/info"); client.Timeout = -1; var request = new RestRequest(Method.POST); request.AddHeader("apikey", "adasdsadasd"); var body = @"{}"; request.AddParameter("application/json", body, ParameterType.RequestBody); IRestResponse response = client.Execute(request); Console.WriteLine(response.Content);
转换后的HttpClient代码(运行返回400错误):
using (var client = new HttpClient()) { client.BaseAddress = new Uri("http://10.0.0.244:8885/"); client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Clear(); HttpRequestMessage request = new HttpRequestMessage(); request.Method = HttpMethod.Post; request.RequestUri = new Uri($"{client.BaseAddress}/terminal/info"); request.Headers.Add("apikey", "adasdsadasd"); var body = Newtonsoft.Json.JsonConvert.SerializeObject(new { }); request.Content = new StringContent(body, Encoding.UTF8, "application/json");//CONTENT-TYPE header request.Content.Headers.Clear(); request.Content.Headers.ContentLength = 2; request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); HttpResponseMessage response = client.SendAsync(request).GetAwaiter().GetResult(); var x = response.Content.ReadAsStringAsync().GetAwaiter().GetResult(); }
错误原因分析
request.Content.Headers.Clear();清空了StringContent自动添加的Content-Type: application/json请求头,服务器无法识别请求体的JSON格式,直接导致解析错误- 手动设置
request.Content.Headers.ContentLength = 2;完全多余,StringContent会自动计算并设置正确的内容长度,手动设置还可能出现长度不匹配的问题
修正后的HttpClient代码
using (var client = new HttpClient()) { client.BaseAddress = new Uri("http://10.0.0.244:8885/"); // 添加apikey请求头 client.DefaultRequestHeaders.Add("apikey", "adasdsadasd"); // 设置接受JSON格式响应 client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); // 构造空JSON请求体 var body = Newtonsoft.Json.JsonConvert.SerializeObject(new { }); // 自动设置Content-Type为application/json var content = new StringContent(body, Encoding.UTF8, "application/json"); // 直接调用PostAsync简化请求流程 HttpResponseMessage response = client.PostAsync("terminal/info", content).GetAwaiter().GetResult(); var responseContent = response.Content.ReadAsStringAsync().GetAwaiter().GetResult(); Console.WriteLine(responseContent); }
关键优化点
- 移除不必要的内容头清空和手动长度设置,保留
StringContent自动维护的Content-Type头 - 使用
HttpClient.PostAsync简化代码结构,无需手动构建HttpRequestMessage(复杂场景再用后者) - 利用
BaseAddress直接拼接相对路径,避免重复构造Uri - 对齐原RestSharp的请求头设置逻辑,保证行为一致性
内容的提问来源于stack exchange,提问作者Ibrahim Aliyev
相关产品推荐
相关产品推荐

