Я совершенно новичок во Flurl. Я пытаюсь вызвать API и намеренно передал неверный ключ API в параметре, а затем 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>();
}





I want to throw my own custom exception if i get status code 403
Есть 2 способа сделать это. Первый — просто перебросить из блока 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, который вам нужно будет десериализовать самостоятельно, поскольку ReceiveJson Flurl связывает Task<HttpResponseMessage>, а вы уже ждали этого Task. Но, десериализовав его самостоятельно не так уж сложно, есть запланированное улучшение, который решит эту проблему в ближайшем будущем, или вы всегда можете использовать этот небольшой обходной путь:
await Task.FromResult(resp).ReceiveJson<myResponse>();
Честно говоря, я бы, вероятно, пошел с первым подходом. FlurlHttpException имеет несколько удобных методов, таких как GetResponseJsonAsync<T>, которые позволяют вам десериализовать тело ошибки, если это JSON, или GetResponseStringAsync, если вам просто нужна необработанная строка.
Просто чтобы добавить одну вещь к этому превосходному ответу — Flurl также поддерживает опцию
AllowAnyHttpStatus().