c# - 如何处理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>();
}
如果我得到状态码 403,我想抛出我自己的自定义异常,但目前它在线失败var statusCode = await ex.GetResponseJsonAsync<myResponse>();
}
解决方案
如果我得到状态码 403,我想抛出我自己的自定义异常
有两种方法可以做到这一点。第一种是简单地从 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
,你需要自己反序列化,因为 Flurl 的ReceiveJson
链来自 a Task<HttpResponseMessage>
,而你已经 await 了Task
。但是自己反序列化并不难,有一个计划的增强功能将在不久的将来解决这个问题,或者你总是可以使用这个 hacky 的小变通方法:
await Task.FromResult(resp).ReceiveJson<myResponse>();
老实说,我可能会采用第一种方法。FlurlHttpException
有一些方便的方法GetResponseJsonAsync<T>
可以让你反序列化错误主体,如果它是 JSON,或者GetResponseStringAsync
你只需要原始字符串。
推荐阅读
- c++ - 当我们将整数值分配给类的对象时,为什么要调用参数化构造函数?
- webpack - 如何在 webpack 中使用 postcss-loader 和 sass-loader
- sql - 无法识别左连接子查询的 where 子句
- c# - 更新期间 OleDb 并发冲突
- amazon-web-services - 通过 AWS API Gateway 后 JPG 损坏
- html - 当我分配 endDate=new Date() 时,引导日期时间选择器显示禁用一月月份
- azure - 使用 Serilog 到 Application Insights 的 Azure 函数日志记录
- python - 如何在 Python 中将 PDF 转换为 TIFF [CCITT Group 4 传真编码压缩]?
- javascript - 正则表达式检查第一个字符为 + 和其他只是数字
- sql - Oracle触发器-更新同一张表后更新记录