我正在创建一个从外部REST API读取数据的应用程序。我正在尝试利用HttpClientJsonExtensions
和对我的Dto对象类型的响应的自动转换。
HttpClient.SendAsync
会给我一个HttpResponseMessage
,我可以测试状态码,但随后还需要进行反序列化。
HttpClient.PostJsonAsync
将为我进行反序列化,如果呼叫失败或反序列化失败,则会失败。
但是当使用PostJsonAsync
时,如果我得到401,则会导致异常,并且我没有机会对此结果做出反应。
如果我需要对特定代码(例如304)做出反应,则不确定如何使用这些扩展名来执行此操作。这是故意的,HttpClientJsonExtensions
仅对仅成功且没有空间进行此类响应检查的呼叫有用吗?
public async Task<ApiResponse<Response>> PostAsync<Request, Response>(string requestUri, Request request)
{
try
{
var response1 = await _http.PostJsonAsync<ApiResponse<Response>>(requestUri, request);
var response2 = await _http.SendAsync(new HttpRequestMessage() {
//pretend something meaning was already set.
});
var myStatusCode = response2.StatusCode;
var deserialisedObject = JsonSerializer.Deserialize<ApiResponse<Response>>(await response2.Content.ReadAsStringAsync());
return response1;
}
catch (System.Exception)
{
throw; //Error logic here
}
}
答案 0 :(得分:-1)
当其中一种方法失败时(在I / O上,而不是在JSon上),它将抛出HttpRequestException
。
不幸的是,此类没有简单的HttpStatusCode属性。
该代码始终是异常消息的一部分:
响应状态代码不指示成功:404(未找到)。
一个简单的技巧:
catch (HttpRequestException ex)
{
int httpStatus = int.Parse(Regex.Match(ex.Message, @"\d{3}").Value);
...
}