blazor httpClient.PostJsonAsync status code exception

时光毁灭记忆、已成空白 提交于 2020-02-25 09:44:07

问题


When using the HTTP in Blazor client side it only works if the response is a success response, but if it is not found or bad response it gives exception and doesn't complete the code.

I want to parse the object I send in the response even if the request is not successful I mean 400 or 404, I send an object with error list so I need to get it.

It gives me error in the console that the request is not successful.

If I make the request to be (OK) then it works, but I need to send 400 status with the object "RequestResult" how I could manage this?

var result = await _httpClient.PostJsonAsync<RequestResult>("api/account/auth", authModel);

if (result.Successful)
{
    await _localStorage.SetItemAsync("Token", authModel.SecurityToken);
    AuthData.AuthToken= result.Token;
    ((ApiAuthenticationStateProvider)_authenticationStateProvider).MarkUserAsAuthenticated(result.Token);
    _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", result.Token);

    return result;
}

return result;    

and this is the controller code when i change BadRequest to Ok it work

public IActionResult Post([FromBody]AuthModel model)
        {
                var res = _authManager.SignInUser(model);
                if (!res.Successful)
                {
                    return BadRequest(new RequestResult { Successful = false, Errors = new List<string>() { res?.errors } });
                }


                    return Ok(new RequestResult { Successful = true ,Token=res.access_token});
        }

回答1:


PostJsonAsync works this way. It will throw an exception if the content cannot be parsed. Here is a suggested workaround: Required using statement: using System.Text.Json;

var response = await _httpClient.PostAsync("api/account/auth", authModel);
if (response.IsSuccessStatusCode)
{
    //parse result as following
    using (var sr = await response.Content.ReadAsStreamAsync())
    {
        var parsedResult = JsonSerializer.DeserializeAsync<RecipeDetailDto>(sr);
    }
}
else
{
    //If the bad request content/body is a json object
    //parse error content
    using (var sr = await response.Content.ReadAsStreamAsync())
    {
        //If the bad request content is a json
        //var parsedErrorResult = JsonSerializer.DeserializeAsync<yourErroObjset>(sr);
    }
    //OR if the content is string
    var errorResult = await response.Content.ReadAsString();
}

Did not testet it, but it should give you the context how to approach this.



来源:https://stackoverflow.com/questions/57771624/blazor-httpclient-postjsonasync-status-code-exception

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!