我尝试设计一种使用RestSharp以泛型形式发布请求并返回响应的方法。当主体实例是常规的对象类型时,request.AddJsonBody(body)不能在返回“不良请求”状态的情况下使用。
这是我的方法:
public async Task<T> ExecutePostAsync<T, TK>(string url, IDictionary
headers, TK body)
where T : new()
{
var request = new RestRequest(url, Method.POST);
if (headers != null && headers.Count > 0)
{
foreach (object key in headers.Keys)
{
request.AddHeader((string)key, (string)headers[key]);
}
}
request.AddJsonBody(body);
var cancellationTokenSource = new CancellationTokenSource();
IRestResponse response = await _restClient.ExecuteTaskAsync(request, cancellationTokenSource.Token);
if (!response.IsSuccessful)
{
const string message = "Error retrieving response. Check inner details for more info.";
var browserStackException = new ApplicationException(message, response.ErrorException);
throw browserStackException;
}
var result = JsonConvert.DeserializeObject<T>(response.Content);
return result;
}
我使用以下代码调用了它:
result = await _restSharpJsonOperation.ExecutePostAsync<object, object>(url, headers, request);
然后引发异常:
无法将当前JSON数组(例如[1,2,3])反序列化为类型“ IdentifierQuoteRequest”,因为该类型需要JSON对象(例如{\\“ name \\”:\\“ value \\”} )以正确反序列化。要解决此错误,请将JSON更改为JSON对象(例如{\\“ name \\”:\\“ value \\”})或将反序列化类型更改为数组或实现的类型可以从JSON数组反序列化的List等集合接口(例如ICollection,IList),还可以将JsonArrayAttribute添加到该类型中,以强制从JSON数组反序列化
但是,如果我用这个替换AddJsonBody:
request.AddParameter("application/json; charset=utf-8",
JsonConvert.SerializeObject(body), ParameterType.RequestBody);
它将起作用。或者,如果我使用显式主体实例,它将起作用。
我不明白为什么AddJsonBody需要知道显式类型,并且从抛出的异常中知道为什么涉及到Json Array。任何人都可以熟练地解决这个问题吗?谢谢。