Возникают проблемы с возвратом HTTP-ответа через Сервис в ViewModel (UWP MVVM) - PullRequest
2 голосов
/ 27 января 2020

У меня есть интерфейс, который определяется следующим образом:

internal interface IHttpService
{
    Task SendGetRequest(string param);
}

И следующий конкретный класс (очевидно, есть ошибки компиляции):

public class HttpService : IHttpService
{
    private readonly HttpClient client;
    private const string httpLink = "https://somesite.org/search?q=";
    private const string httpSuffix = "&format=json&ads=1";

    public HttpService()
    {
        client = new HttpClient();
        client.DefaultRequestHeaders.Add("user-agent", "myapp");
    }

    public async Task SendGetRequest(string param)
    {
        var response = await client.GetAsync(httpLink + param + httpSuffix);
        return response.Content.ReadAsStringAsync();
    }
}

Так что я, очевидно, получаю компиляцию ошибка при возврате функции ReadAsStringAsyn c, но я хочу, чтобы моя модель представления получила ответ от этой функции. Моя модель представления выглядит следующим образом:

    public SearchViewModel()
    {
        httpService = (App.Current as App).Container.GetService<IHttpService>();

        SearchCommand = new RelayCommand(() =>
        {
            // Will need to do some proper validation here at some point
            var response = await httpService.SendGetRequest(httpStringToSend);
        });
    }

Я уверен, что что-то упустил, но я не совсем уверен, что ...

1 Ответ

1 голос
/ 27 января 2020

ReadAsStringAsync является асинхронным и его нужно ожидать.

Вам также необходимо использовать generi c Task<T> в качестве типа возврата, а не Task, поскольку ваша асинхронная операция возвращает значение то есть string.

public async Task<string> SendGetRequest(string param)
{
    var response = await client.GetAsync(httpLink + param + httpSuffix);
    return await response.Content.ReadAsStringAsync();
}

HttpResponseMessage также IDisposable, поэтому вы должны добавить using блок:

public async Task<string> SendGetRequest(string param)
{
    using (var response = await client.GetAsync(httpLink + param + httpSuffix))
    {
        return await response.Content.ReadAsStringAsync();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...