如何处理 flurl 中的错误请求异常
how to handle bad request exception in flurl
我完全不熟悉 Flurl.I 我正在尝试调用 api 我故意在参数中传递了无效的 apikey 然后 api 失败说 "Forbidden" 和错误代码 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>();
上失败
}
I want to throw my own custom exception if i get status code 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(...);
}
第二种方法的一个警告是,您将得到一个 "raw" HttpResponseMessage
that you'll need to deserialize yourself, since Flurl's ReceiveJson
chains off a Task<HttpResponseMessage>
, and you've already awaited that Task
. But deserializing it yourself is not that hard, there's a planned enhancement 将在不久的将来解决这个问题,或者您总是可以使用这个 hacky 的小变通方法:
await Task.FromResult(resp).ReceiveJson<myResponse>();
老实说,我可能会选择第一种方法。 FlurlHttpException
有一些方便的方法,例如 GetResponseJsonAsync<T>
,如果它是 JSON,则允许您反序列化错误主体,或者如果您只需要原始字符串,则 GetResponseStringAsync
。
我完全不熟悉 Flurl.I 我正在尝试调用 api 我故意在参数中传递了无效的 apikey 然后 api 失败说 "Forbidden" 和错误代码 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>();
上失败
}
I want to throw my own custom exception if i get status code 403
有两种方法可以做到这一点。第一种是简单地从 catch 块中重新抛出(catch
/when
在这里很方便):
try
{
...
}
catch (FlurlHttpException ex) when (ex.Call.HttpStatus == HttpStatusCode.Forbidden)
{
throw new MyException(...);
}
第二种方法是使用 AllowHttpStatus
:
var resp = await "https://myapi.com/rest/age?apikey=XXXXXXXX"
.AllowHttpStatus("4xx")
.PostJsonAsync(apirequest);
if (resp.StatusCode == HttpStatusCode.Forbidden)
{
throw new MyException(...);
}
第二种方法的一个警告是,您将得到一个 "raw" HttpResponseMessage
that you'll need to deserialize yourself, since Flurl's ReceiveJson
chains off a Task<HttpResponseMessage>
, and you've already awaited that Task
. But deserializing it yourself is not that hard, there's a planned enhancement 将在不久的将来解决这个问题,或者您总是可以使用这个 hacky 的小变通方法:
await Task.FromResult(resp).ReceiveJson<myResponse>();
老实说,我可能会选择第一种方法。 FlurlHttpException
有一些方便的方法,例如 GetResponseJsonAsync<T>
,如果它是 JSON,则允许您反序列化错误主体,或者如果您只需要原始字符串,则 GetResponseStringAsync
。