.NET MAUI вывод данных из web api в ListView ошибка 'Unexpected character encountered while parsing value: <. Path '', line 0, position 0.'
Я пытаюсь подключиться к Web API в моем приложении .NET MAUI и вывести данные JSON в ListView. Вот метод который я использую
private async void LoadData()
{
string url = "http://10.0.2.2:49924/api/users/";
try
{
HttpClient client = new HttpClient();
using HttpResponseMessage response = await client.GetAsync(url);
using HttpContent content = response.Content;
var json = await content.ReadAsStringAsync();
LviewUser.ItemsSource = JsonConvert.DeserializeObject<List<User>>(json.ToString());
}
catch (Exception)
{ }
}
При запуске на android возникает ошибка
Newtonsoft.Json.JsonReaderException: 'Unexpected character encountered while parsing value: <. Path '', line 0, position 0.'
и в переменной json появляются следующие данные
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"\"http://www.w3.org/TR/html4/strict.dtd\">\r\n<HTML><HEAD><TITLE>Bad Request</TITLE>\r\n<META HTTP-EQUIV=\"Content-Type\" Content=\"text/html; charset=us-ascii\"></HEAD>\r\n<BODY><h2>Bad Request - Invalid Hostname</h2>\r\n<hr><p>HTTP Error 400. The request hostname is invalid.</p>\r\n</BODY></HTML>\r\n"
Когда я запускаю приложение на Windows Machine изменив url на "http://localhost:49924/api/users" все работает как надо и в переменной хранятся данные json
Ответы (1 шт):
Проблема не на стороне клиента, а у сервера. Разбирайтесь с настройками там. Видите же что сервер вернул 400 Bad Request. Просто на ошибки надо уметь правильно реагировать.
Потом, зачем вы в MAUI используете устаревший Newtonsoft.Json, выбрасывайте, просто удалите эту библиотеку и используйте более современный встроенный сериализатор.
Давайте подправлю всё что вижу
using System.Text.Json;
using System.Diagnostics;
// HttpClient надо создавать 1 раз, а не на каждый запрос заново
private static readonly HttpClient client = new()
{
DefaultRequestVersion = HttpVersion.Version20 // включение поддержки HTTP/2
};
private async void LoadData()
{
string url = "http://10.0.2.2:49924/api/users/";
try
{
using HttpResponseMessage response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead);
Debug.WriteLine($"Response: {(int)response.StatusCode} {response.ReasonPhrase}"); // статус ответа сервера
response.EnsureSuccessStatusCode(); // выброс исключения, если запрос не был успешным
string json = await response.Content.ReadAsStringAsync();
LviewUser.ItemsSource = JsonSerializer.Deserialize<List<User>>(json);
}
catch (Exception ex)
{
Debug.Fail(ex.ToString()); // выведет ошибку в консоль студии
}
}
Можно ещё проще
using System.Net.Http.Json;
private async void LoadData()
{
string url = "http://10.0.2.2:49924/api/users/";
try
{
LviewUser.ItemsSource = await client.GetFromJsonAsync<List<User>>(url);
}
catch (Exception ex)
{
Debug.Fail(ex.ToString());
}
}