как обработать исключение неправильного запроса в flurl - PullRequest
2 голосов
/ 06 марта 2019

Я совершенно новичок во 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 Ответ

2 голосов
/ 06 марта 2019

Я хочу выдать свое собственное исключение, если я получу код состояния 403

Есть 2 способа сделать это. Во-первых, просто отбросить блок захвата (здесь удобно использовать 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, который вам нужно будет десериализовать самостоятельно, так как ReceiveJson Флурла связывает с Task<HttpResponseMessage>, и вы уже ждали, что Task. Но десериализовать его самостоятельно не так уж сложно , есть запланированное улучшение , которое решит эту проблему в ближайшем будущем, или вы всегда можете использовать этот хакерский обходной прием:

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

Честно говоря, я бы, наверное, пошел с первым подходом. FlurlHttpException имеет несколько удобных методов, таких как GetResponseJsonAsync<T>, которые позволяют десериализовать тело ошибки, если это JSON, или GetResponseStringAsync, если вам просто нужна необработанная строка.

...