当前位置: 首页 > 知识库问答 >
问题:

RestSharp GetAsync忽略响应错误状态代码

太叔灿
2023-03-14

我是不是漏掉了什么?我应该如何使用这些异步方法来处理这样的错误响应呢?

共有1个答案

贺正祥
2023-03-14

那行为也让我很反感。

查看GitHub中RestClientExtensions的源代码,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;
}

您希望throwiferror会查看HTTP状态代码,但查看RestSharp文档中的错误处理,它会显示:

static void ThrowIfError(IRestResponse response)
{
    var exception = response.ResponseStatus switch
    {
        ResponseStatus.Aborted   => new WebException("Request aborted", response.ErrorException),
        ResponseStatus.Error     => response.ErrorException,
        ResponseStatus.TimedOut  => new TimeoutException("Request timed out", response.ErrorException),
        ResponseStatus.None      => null,
        ResponseStatus.Completed => null,
        _                        => throw response.ErrorException ?? new ArgumentOutOfRangeException()
    };

    if (exception != null)
        throw exception;
}

关于你的问题:

我应该如何使用这些异步方法来处理这样的错误响应呢?

你不能:(。

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; }
}
public Task<MyModel> SomeRequest()
{
    var request = new RestRequest()
    {
        Resource = "some-resource",
    };

    return GetAsync<MyModel>(request);
}
 类似资料:
  • 问题内容: 我有一个API调用,我需要对其进行一些检查并可能返回各种状态代码。我不需要自定义视图或任何东西,我只需要返回正确的代码。如果用户未通过适当的凭据,则需要返回401状态。如果他们尚未发送受支持的请求格式,则需要返回400状态。 因为它是一个API,所以我真正想做的就是设置响应状态并以一条简单的愚蠢消息退出,该消息说明请求失败的原因(可能使用)。刚好足以完成工作,但我还无法使其正常工作。我

  • 在我使用的JavaSpring应用程序中,从一个叫做的第三方,我们在JSON中获得错误响应,其中包含200个响应代码。 e. g. 如何将转换为400整数表示形式。Apacheinte似乎没有提供任何这样做的接口。

  • 我的服务使用WebApi。它有一个带有GET方法的控制器。当我从客户端调用它并返回未授权的状态代码时,我在HttpResponseMessage中没有得到未授权,而是没有找到。 这是我从客户端调用它的方式: < code >响应的内容: 我在 GetTest() 处放置了一个断点,它在那里停止,所以它到达了控制器方法。 为什么我在客户端中收到“未找到”,而不是“未经授权”?

  • 我已经创建了服务器过滤器,它计算响应大小。它通过创建响应包装器来实现这一点,该包装器将与Apache Commons包装在一起。此外,包装器创建带有包装流的PrintWriter。因此,理论上,无论使用什么方法来创建实际输出,都应该通过CountingOutputStream。 问题是,虽然整个过程对于典型的servlet请求都有效,但对于静态内容却失败了。准确地说,过滤器接收请求,创建响应包装,

  • QueryList遵循将业务与错误分离的原则, HTTP请求传输过程中如果出现的错误,QueryList将会抛出异常。 QueryList的HTTP客户端基于GuzzleHttp,它提供了丰富的HTTP异常类型,用户可以自行设计根据不同的异常类型做不同的处理。 如果你觉得麻烦,并不想每次都去处理HTTP异常,选择直接忽略,让程序继续运行下去,做法可以参考下面方式: 对内置的get()进行封装: u

  • 我试图在aws.lamda-service上的node.js中创建函数,并在函数控制台进行测试,效果良好,但当调用api时,它不能导出到外部,api网关错误“malformed Lambda proxy response”状态错误502 有什么想法吗