我是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>();
}
如果我得到状态代码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
,如果你只需要原始字符串。