.NET MAUI вывод данных из web api в ListView ошибка 'Unexpected character encountered while parsing value: <. Path '', line 0, position 0.'

Рейтинг: 0Ответов: 1Опубликовано: 30.03.2023

Я пытаюсь подключиться к 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

Ответы

▲ 0Принят

Проблема не на стороне клиента, а у сервера. Разбирайтесь с настройками там. Видите же что сервер вернул 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());
    }
}