如何使用HttpClientJsonExtensions获取状态代码?

时间:2019-09-18 06:28:50

标签: c# json .net-core blazor

我正在创建一个从外部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
        }

    }

1 个答案:

答案 0 :(得分:-1)

当其中一种方法失败时(在I / O上,而不是在JSon上),它将抛出HttpRequestException

不幸的是,此类没有简单的HttpStatusCode属性。
该代码始终是异常消息的一部分:

  

响应状态代码不指示成功:404(未找到)。

一个简单的技巧:

catch (HttpRequestException ex)
{
    int httpStatus = int.Parse(Regex.Match(ex.Message, @"\d{3}").Value);    
    ...    
}