我正在使用Flurl Client调用带有发布数据的静态API。在服务器上对我提交的数据进行了验证,它返回了包含针对用户的错误消息的标头。
由于请求要求不满足,服务器将请求标记为400 BadRequest
。在下面的cli.Request(uri).PostJsonAsync(data)
行中的代码中,它使用适当的状态代码引发FlurlHttpException
。
现在,由于用户输入的数据存在问题,我想用头信息从服务器收到的错误消息向用户报告。但是,由于请求失败,我无法访问响应头。
还有其他方法可以使用Flurl从失败的请求中访问响应头吗?
try
{
using (var cli = new FlurlClient(baseUrl))
{
var httpResponse = await cli.Request(uri).PostJsonAsync(data);
var errorMessage = httpResponse.GetHeaderValue("errorMessage");
}
}
catch (FlurlHttpException ex)
{
}
我正在配置错误事件处理程序以报告任何错误。结果,该代码不会跳转到异常块,而是异步触发事件处理程序,其余的后续代码将使用适当的httpResponseMessage
,StatusCode,标头包含所有内容执行OK。
...
FlurlHttp.Configure(settings => settings.OnErrorAsync = HandleFlurlErrorAsync);
using (var cli = new FlurlClient(baseUrl))
{
var httpResponse = await cli.Request(uri).PostJsonAsync(data);
var errorMessage = httpResponse.GetHeaderValue("errorMessage");
}
...
private async Task HandleFlurlErrorAsync(HttpCall call)
{
//Log your exception here
call.ExceptionHandled = true;
}
使用事件处理程序是可行的,但我认为这些方法更适合横切关注点,例如您不想使应用程序的主流程混乱的日志记录。您基本上想在该主要流程中允许和/或处理400个响应。您可以使用AllowHtttpStatus更直接地执行此操作,该操作可以在客户端上设置:
cli.AllowHtttpStatus(HttpStatusCode.BadRequest);
或请求:
var httpResponse = await cli
.Request(uri)
.AllowHttpStatus(HttpStatusCode.BadRequest)
.PostJsonAsync(data);
无论哪种方式,通话都不会打出400。
另一种方法,如果您的应用程序逻辑在错误条件下采取的路径与在成功条件下采取的路径完全不同,我建议您使用try/catch
并使用Response
属性处理错误情况的异常:
try
{
await cli.Request(uri).PostJsonAsync(data);
// handle success condition
}
catch (FlurlHttpException ex) when (ex.Response?.StatusCode == 400)
{
var errorMessage = ex.Response.GetHeaderValue("errorMessage");
// handle error condition
}
作为旁注,由于3.0直接涉及其中一些领域,因此您应该注意3.0中的一些重大更改: