首页 > 解决方案 > 如何处理flurl中的错误请求异常

问题描述

我对 Flurl 完全陌生。我正在尝试调用 api,但我故意在参数中传递了无效的 apikey,然后 api 无法说出“禁止”并出现错误代码 403。我该如何处理异常?

 public async Task<myResponse> MyService(myRequest request)
    {
        try
        {


            return await new Flurl.Url("https://myapi.com/rest/age?apikey=XXXXXXXX").PostJsonAsync(apirequest).ReceiveJson<myResponse>();
        }
        catch (FlurlHttpException ex)
        {
            var statusCode = await ex.GetResponseJsonAsync<myResponse>();
            return await ex.GetResponseJsonAsync<myResponse>();

        }

如果我得到状态码 403,我想抛出我自己的自定义异常,但目前它在线失败var statusCode = await ex.GetResponseJsonAsync<myResponse>(); }

标签: c#visual-studiocontrollerflurl

解决方案


如果我得到状态码 403,我想抛出我自己的自定义异常

有两种方法可以做到这一点。第一种是简单地从 catch 块中重新抛出(catch/when在这里很方便):

try
{
    ...
}
catch (FlurlHttpException ex) when (ex.Call.HttpStatus == HttpStatusCode.Forbidden)
{
    throw new MyException(...);
}

第二种方法是通过使用来防止 Flurl 抛出AllowHttpStatus

var resp = await "https://myapi.com/rest/age?apikey=XXXXXXXX"
    .AllowHttpStatus("4xx")
    .PostJsonAsync(apirequest);

if (resp.StatusCode == HttpStatusCode.Forbidden)
{
    throw new MyException(...);
}

第二种方法的一个警告是,你留下了一个“原始” HttpResponseMessage,你需要自己反序列化,因为 Flurl 的ReceiveJson链来自 a Task<HttpResponseMessage>,而你已经 await 了Task。但是自己反序列化并不难,有一个计划的增强功能将在不久的将来解决这个问题,或者你总是可以使用这个 hacky 的小变通方法:

await Task.FromResult(resp).ReceiveJson<myResponse>();

老实说,我可能会采用第一种方法。FlurlHttpException有一些方便的方法GetResponseJsonAsync<T>可以让你反序列化错误主体,如果它是 JSON,或者GetResponseStringAsync你只需​​要原始字符串。


推荐阅读