如何处理flurl中的错误请求异常

时间:2019-03-06 10:27:38

标签: c# visual-studio controller flurl

我对Flurl完全陌生。我试图调用api,并故意在参数中传递了无效的apikey,然后api无法显示“禁止”且错误代码为403。我该如何处理Exception?

 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>();上失败         }

1 个答案:

答案 0 :(得分:2)

  

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

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

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

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

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束缚了Task<HttpResponseMessage>,并且您已经在等待Task。但是,您可以自己is not that hard对其进行反序列化,有一个planned enhancement可以在不久的将来解决此问题,或者您可以始终使用这种小巧的变通方法:

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

老实说,我可能会选择第一种方法。 FlurlHttpException有一些方便的方法,例如GetResponseJsonAsync<T>,如果是JSON,则可以反序列化错误正文;如果只需要原始字符串,则可以GetResponseStringAsync进行反序列化。