You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 12:45:32