C# HttpClient - Как получить сообщение об ошибке с сервера NestJS
Доброго времени суток.
Суть вопроса такова - есть desktop-приложение C# WPF, которое взаимодействует с сервером, написанном на NestJS через HttpClient.
Возникла проблема с обработкой исключений, а именно - вместо текста ошибки, который приходит с сервера, HttpClient подставляет свой текст, что меня не устраивает. Статус-код ошибки при этом возвращается корректно.
Часть кода функции, которая отправляет http запрос на сервер:
try
{
var queryString = "?id=" + userID;
HttpResponseMessage response = await api.GetAsync("user/" + queryString);
response.EnsureSuccessStatusCode();
user = await response.Content.ReadFromJsonAsync<IUser>();
}
catch (HttpRequestException ex)
{
Console.WriteLine(ex.Message);
}
Как выглядит объект ошибки, которая отправляется с сервера:
{
"statusCode": 404,
"message": "По Вашему запросу ничего не найдено"
}
Какой текст ошибки получает пользователь в приложении:
Response status code does not indicate success: 404 (Not Found).
Грубо говоря, текст в поле message заменяется обычным шаблонным текстом, не несущим никакого смысла для пользователя.
Подскажите, пожалуйста, возможно ли как-то получить текст ошибки, приходящий именно с сервера, минуя шаблонный текст HttpClient?
Ответы (2 шт):
HttpRequestException
- в данном случае, это исключение бросаемое при проверке статуса (response.EnsureSuccessStatusCode();
), и показывает только информацию связанную со статусом отличным от 2хх.
Для получения информации отправленной сервером, нужно, также как и при успешном ответе, прочитать тело сообщения
catch (HttpRequestException ex)
{
Console.WriteLine(ex.Message);
var error = await response.Content.ReadFromJsonAsync<ErrorType>();
}
Вам нужно прочитать ошибку, а вы бросаете исключение. Оно само её не вычитает.
try
{
string queryString = $"?id={userID}";
using HttpResponseMessage response = await api.GetAsync("user/" + queryString);
if (response.IsSuccessStatusCode)
{
user = await response.Content.ReadFromJsonAsync<IUser>();
}
else
{
IError error = await response.Content.ReadFromJsonAsync<IError>();
throw new Exception($"[{error.StatusCode}] {error.Message}");
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}