Error handling RestSharp GetAsync忽略响应错误状态代码
关于RestSharp的Error handling RestSharp GetAsync忽略响应错误状态代码,error-handling,restsharp,http-status-codes,Error Handling,Restsharp,Http Status Codes,关于RestSharp的GetAsync方法的评论明确提到: 使用GET HTTP方法执行请求。如果请求未成功,将引发异常 我不知道该怎么解释。我希望它在返回未成功HTTP状态代码时抛出异常。情况似乎并非如此。当返回404或500状态时,该方法愉快地尝试反序列化响应。只有当响应主体包含无效的json(或xml,或任何“已接受”的内容)时,才会抛出错误 我错过什么了吗?我应该如何使用这些异步方法处理这样的错误响应?这种行为也让我很反感 查看的源代码,GetAsync方法实现为: public st
GetAsync
方法的评论明确提到:
使用GET HTTP方法执行请求。如果请求未成功,将引发异常
我不知道该怎么解释。我希望它在返回未成功HTTP状态代码时抛出异常。情况似乎并非如此。当返回404或500状态时,该方法愉快地尝试反序列化响应。只有当响应主体包含无效的json(或xml,或任何“已接受”的内容)时,才会抛出错误
我错过什么了吗?我应该如何使用这些异步方法处理这样的错误响应?这种行为也让我很反感 查看的源代码,
GetAsync
方法实现为:
public static async Task<T> GetAsync<T>(this IRestClient client, IRestRequest request, CancellationToken cancellationToken = default)
{
var response = await client.ExecuteGetAsync<T>(request, cancellationToken);
ThrowIfError(response);
return response.Data;
}
关于你的问题:
我应该如何使用这些异步方法处理此类错误响应
你不能:(
我相信您必须实现自己的Get
异步实现
下面是我所做工作的一个例子:
private Task<T> GetAsync<T>(RestRequest request)
{
return Task.Run(() =>
{
var response = client.Get<T>(request);
if (response.IsSuccessful)
return response.Data;
//handle the errors as you wish. In my case, the api I work with always
//returns a bad request with a message property when it occurs...
var errorData = JsonConvert.DeserializeObject<ApiMessage>(response.Content);
throw new Exception(errorData.Message);
});
}
public class ApiMessage
{
public string Message { get; set; }
}
private Task GetAsync(RestRequest请求)
{
返回任务。运行(()=>
{
var response=client.Get(请求);
if(response.issucessful)
返回响应数据;
//按照您的意愿处理错误。在我的情况下,我使用的api总是
//发生错误请求时,返回带有消息属性的错误请求。。。
var errorData=JsonConvert.DeserializeObject(response.Content);
抛出新异常(errorData.Message);
});
}
公共类消息
{
公共字符串消息{get;set;}
}
用法:
public Task<MyModel> SomeRequest()
{
var request = new RestRequest()
{
Resource = "some-resource",
};
return GetAsync<MyModel>(request);
}
公共任务SomeRequest()
{
var request=new RestRequest()
{
Resource=“some Resource”,
};
返回GetAsync(请求);
}
来源:作为一个应该如何做的示例,以及我期望它如何工作,请看一下Flurl HttpClient是如何做的:
public Task<MyModel> SomeRequest()
{
var request = new RestRequest()
{
Resource = "some-resource",
};
return GetAsync<MyModel>(request);
}