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

问题描述 投票:2回答:1

我是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-studio controller flurl
1个回答
2
投票

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

有两种方法可以做到这一点。首先是简单地从一个捕获块重新抛出(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将在不久的将来解决这个问题,或者你总是可以使用这个hacky小小的解决方法:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.