如何使用点 NET 中的 RestSharp RestClient 将 api return json 数据作为字符串使用
How to consume api that return json data as string using RestSharp RestClient in dot NET
我正在使用 API return 的 json 数据作为字符串。即它的return类型是Task<string>
。通常 API return 是 Response class 的对象,然后由 dot NET 序列化。但在这种情况下,API returns 序列化版本的 Response class.
我正在尝试使用 RestSharp->RestClient 使用此 API。在 RestClient 方法 ExecutePostAsync(request) 中,该方法将响应反序列化为指定的 class 对象,以代替 T。我将 class 命名为 Response class,其中我希望响应被反序列化。所以,我提出请求,
_restClient.ExecutePostAsync<Response>(request)
现在我面临的问题是 json 字符串 return 响应 API 的格式为 "{<json-fields>}"
,但是当接收到 RestClient 时它是表格 \"{<json-fields>}\"
。即向其中添加了转义字符。因此,RestClient 用于序列化和反序列化的 NewtonSoftJSON 给出了错误,Error converting \"{<json-fields>}\" to Response class
.
我还需要来自 RestClient 的原始 RestResponse,因为我正在对 RestResponse 执行验证。所以,不能像这样,将响应作为字符串获取并反序列化。那是我不想做,
var restResponse = _restClient.ExecutePostAsync<string>(request);
var data = Deserialize(restResponse.Data);
因为这只会给我 Response class 的对象,但我需要 RestResponse class 的对象来执行验证。
遇到这种情况我该怎么办?
如果您无法将 api 修复为 json 格式的响应,我看到的唯一方法是清理您的字符串响应:
var data = Deserialize(restResponse.Data.ToString.Replace('\"',(char)0));
您还应该查看 RestSharp 的文档,您可以发出将 [Type] 传递给 auto-deserialize 的请求,响应:
var request = new CreateOrder("123", "foo", 10100);
// Will post the request object as JSON to "orders" and returns a
// JSON response deserialized to OrderCreated
var result = client.PostJsonAsync<CreateOrder, **OrderCreated**>("orders", request, cancellationToken);
希望对您有所帮助!
通过网上的一些研究,我找到了以下解决方案,
我们将 RestClient 和 RestRequest 初始化为,
RestClient restClient = new RestClient();
RestRequest request = new RestRequest(<url>);
现在 api 的响应是 json 简单字符串中的数据,我们可以指示请求接受文本响应,如下所示,
restRequest.AddHeader("Accept", "text/plain");
现在,RestClient 默认不对响应类型使用 NewtonSoftJson 反序列化 text/plain
。因此,我们需要添加一个处理程序来告诉 RestClient 使用 NewtonSoftJson 反序列化,如下所示,
restClient.AddHandler("text/plain", () => new RestSharp.Serializers.NewtonsoftJson.JsonNetSerializer());
现在我们可以按如下方式进行请求,它会正常工作,
restRequest.AddJsonBody(<body>);
restClient.ExceutePostAsync<T>(restRequest);
我们可以将 T
替换为 class,我们希望在其中反序列化我们的响应。
参考文献:
https://github.com/restsharp/RestSharp/issues/276
我正在使用 API return 的 json 数据作为字符串。即它的return类型是Task<string>
。通常 API return 是 Response class 的对象,然后由 dot NET 序列化。但在这种情况下,API returns 序列化版本的 Response class.
我正在尝试使用 RestSharp->RestClient 使用此 API。在 RestClient 方法 ExecutePostAsync
_restClient.ExecutePostAsync<Response>(request)
现在我面临的问题是 json 字符串 return 响应 API 的格式为 "{<json-fields>}"
,但是当接收到 RestClient 时它是表格 \"{<json-fields>}\"
。即向其中添加了转义字符。因此,RestClient 用于序列化和反序列化的 NewtonSoftJSON 给出了错误,Error converting \"{<json-fields>}\" to Response class
.
我还需要来自 RestClient 的原始 RestResponse,因为我正在对 RestResponse 执行验证。所以,不能像这样,将响应作为字符串获取并反序列化。那是我不想做,
var restResponse = _restClient.ExecutePostAsync<string>(request);
var data = Deserialize(restResponse.Data);
因为这只会给我 Response class 的对象,但我需要 RestResponse
遇到这种情况我该怎么办?
如果您无法将 api 修复为 json 格式的响应,我看到的唯一方法是清理您的字符串响应:
var data = Deserialize(restResponse.Data.ToString.Replace('\"',(char)0));
您还应该查看 RestSharp 的文档,您可以发出将 [Type] 传递给 auto-deserialize 的请求,响应:
var request = new CreateOrder("123", "foo", 10100);
// Will post the request object as JSON to "orders" and returns a
// JSON response deserialized to OrderCreated
var result = client.PostJsonAsync<CreateOrder, **OrderCreated**>("orders", request, cancellationToken);
希望对您有所帮助!
通过网上的一些研究,我找到了以下解决方案,
我们将 RestClient 和 RestRequest 初始化为,
RestClient restClient = new RestClient();
RestRequest request = new RestRequest(<url>);
现在 api 的响应是 json 简单字符串中的数据,我们可以指示请求接受文本响应,如下所示,
restRequest.AddHeader("Accept", "text/plain");
现在,RestClient 默认不对响应类型使用 NewtonSoftJson 反序列化 text/plain
。因此,我们需要添加一个处理程序来告诉 RestClient 使用 NewtonSoftJson 反序列化,如下所示,
restClient.AddHandler("text/plain", () => new RestSharp.Serializers.NewtonsoftJson.JsonNetSerializer());
现在我们可以按如下方式进行请求,它会正常工作,
restRequest.AddJsonBody(<body>);
restClient.ExceutePostAsync<T>(restRequest);
我们可以将 T
替换为 class,我们希望在其中反序列化我们的响应。
参考文献:
https://github.com/restsharp/RestSharp/issues/276