Jam*_*mes 5 c# controller visual-studio flurl
我是 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>();
}
Run Code Online (Sandbox Code Playgroud)
如果我得到状态代码 403,我想抛出我自己的自定义异常,但目前它在线失败var statusCode = await ex.GetResponseJsonAsync<myResponse>();
}
Tod*_*ier 10
如果我得到状态代码 403,我想抛出我自己的自定义异常
有 2 种方法可以做到这一点。第一个是简单地从 catch 块重新抛出(catch/when在这里很方便):
try
{
...
}
catch (FlurlHttpException ex) when (ex.Call.HttpStatus == HttpStatusCode.Forbidden)
{
throw new MyException(...);
}
Run Code Online (Sandbox Code Playgroud)
第二种方法是使用AllowHttpStatus以下方法防止 Flurl 抛出:
var resp = await "https://myapi.com/rest/age?apikey=XXXXXXXX"
.AllowHttpStatus("4xx")
.PostJsonAsync(apirequest);
if (resp.StatusCode == HttpStatusCode.Forbidden)
{
throw new MyException(...);
}
Run Code Online (Sandbox Code Playgroud)
第二种方法的一个警告是,您HttpResponseMessage将需要反序列化自己的“原始” ,因为 Flurl 的ReceiveJson链是Task<HttpResponseMessage>,而您已经等待了Task。但是自己反序列化它并不难,有计划的增强功能将在不久的将来解决这个问题,或者您可以随时使用这个 hacky 小变通方法:
await Task.FromResult(resp).ReceiveJson<myResponse>();
Run Code Online (Sandbox Code Playgroud)
老实说,我可能会采用第一种方法。FlurlHttpException有一些方便的方法GetResponseJsonAsync<T>,如果它是 JSON,或者GetResponseStringAsync如果您只需要原始字符串,则允许您反序列化错误正文。
| 归档时间: |
|
| 查看次数: |
3912 次 |
| 最近记录: |