【问题标题】:how to handle bad request exception in flurl如何处理flurl中的错误请求异常
【发布时间】:2019-03-06 10:27:38
【问题描述】:

我对 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&lt;myResponse&gt;(); 线上失败 }

【问题讨论】:

    标签: c# visual-studio controller flurl


    【解决方案1】:

    如果我得到状态码 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&lt;HttpResponseMessage&gt;,而您已经在等待那Task。但是你自己反序列化它is not that hard,有一个planned enhancement 会在不久的将来解决这个问题,或者你总是可以使用这个hacky little work-around:

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

    老实说,我可能会采用第一种方法。 FlurlHttpException 有一些方便的方法,例如 GetResponseJsonAsync&lt;T&gt;,如果它是 JSON,则允许您反序列化错误正文,如果您只需要原始字符串,则可以反序列化 GetResponseStringAsync

    【讨论】:

    • 只是为这个出色的答案添加一件事 -- Flurl 还支持 AllowAnyHttpStatus() 选项。
    猜你喜欢
    • 2015-12-26
    • 2016-10-31
    • 2019-10-19
    • 1970-01-01
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    • 2019-10-04
    • 2011-02-26
    相关资源
    最近更新 更多