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

RestSharp请求返回Invalid JSON字符串与Not Acceptable状态码排查求助

排查API请求的"Invalid JSON string"与"Not Acceptable"问题

一、查看原始响应内容,确认是否为响应问题

要绕过自动反序列化查看服务器返回的原始内容,你可以暂时改用非泛型的Execute方法,直接获取响应的原始文本:

// 替换原泛型执行逻辑,先获取原始响应
var rawResponse = client.Execute(request);
// 输出或记录原始内容、状态码、ContentType
Debug.WriteLine("原始响应内容:" + rawResponse.Content);
Debug.WriteLine("响应状态码:" + rawResponse.StatusCode);
Debug.WriteLine("响应ContentType:" + rawResponse.ContentType);

这样就能看到服务器实际返回的内容——如果是406状态码,服务器大概率返回的是HTML错误页、纯文本提示而非JSON,这时候强制反序列化自然会抛出"Invalid JSON string"异常。

二、你的代码中的几个潜在问题

  1. 多余的RequestFormat设置
    GET请求没有请求体,request.RequestFormat = DataFormat.Json;完全没必要,反而可能让请求带上不必要的Content-Type头,干扰服务器判断,直接删掉即可。

  2. 强制修改响应ContentType会掩盖真实问题
    request.OnBeforeDeserialization = respons => respons.ContentType = "application/json";会强制把响应的ContentType改成JSON,哪怕服务器返回的是其他格式(比如406对应的错误内容)。RestSharp会基于这个强制设置去反序列化非JSON内容,直接触发"Invalid JSON string"异常,必须删掉这行。

  3. 缺少Accept请求头(406状态码的核心原因)
    服务器返回"Not Acceptable"(406),通常是因为客户端未明确告知服务器自己接受的响应格式。你需要添加Accept头,明确要求JSON格式:

request.AddHeader("Accept", "application/json");

这是解决406状态码的关键步骤。

  1. 异步代码写法冗余
    你用Task.Run包裹client.Execute<T>再加ContinueWith的写法过于绕,RestSharp本身提供异步方法ExecuteAsync<T>,可以简化为:
var response = await client.ExecuteAsync<T>(request);

如果必须使用同步等待,也可以简化逻辑,避免不必要的任务嵌套。

调整后的核心代码示例

var client = new RestClient(base_Url.BaseURL);
var request = new RestRequest(endPoint, Method.GET);

// 添加Accept头,明确请求JSON响应
request.AddHeader("Accept", "application/json");
// 使用认证器添加Bearer token
client.Authenticator = new OAuth2AuthorizationRequestHeaderAuthenticator(accessToken, "Bearer");

// 调试阶段先查看原始响应
var rawResponse = client.Execute(request);
Debug.WriteLine(rawResponse.Content);

// 正式请求(调试完成后可保留)
var response = client.Execute<T>(request);

内容的提问来源于stack exchange,提问作者High Plains Grifter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 17:58:28