Xamarin HttpClient

Я использую Xamarin Forms для использования REST Api из NetFlix, но я получаю эту проблему во всплывающем окне: System.Net.WebException: Error: NameResolutionFailure

Почему я получаю эту ошибку?

Мой код:

private HttpClient client = new HttpClient();
    private List<Movie> movies;

    public async Task<List<Movie>> LocalizaFilmesPorAtor(string ator)
    {

        if (string.IsNullOrWhiteSpace(ator))
        {
            return null;
        }
        else
        {
            string url = string.Format("http://netflixroulette.net/api/api.php?actor={0}", ator);
            var response = await client.GetAsync(url);

            if (response.StatusCode == HttpStatusCode.NotFound)
            {
                movies = new List<Movie>();
            } else
            {

                var content = await response.Content.ReadAsStringAsync();
                var _movies = JsonConvert.DeserializeObject<List<Movie>>(content);
                movies = new List<Movie>(_movies);
            }

            return movies;
        }
    }

В режиме отладки сказал, что ошибка в этом коде

string url = string.Format("http://netflixroulette.net/api/api.php?actor={0}", ator);
            var response = await client.GetAsync(url);

Он останавливается там, URL-адрес получает URL-адрес + имя актера, но в следующей строке ответ остается нулевым.

PS: я даю интернет-разрешение своему приложению в манифесте!


person Gabriel Gomes    schedule 19.02.2017    source источник
comment
NameResolutionFailure обычно означает проблему с DNS. Вы убедились, что можете загрузить этот сайт из браузера устройства?   -  person Jason    schedule 19.02.2017
comment
Если URL-адрес не работает, проверьте URL-адрес в браузере. иногда это на их стороне, чем на вашей. Еще одна причина добавить перехват ошибок в ваш код   -  person user7568042    schedule 20.02.2017
comment
В эмуляторе Android я часто получаю это, иногда сетевой мост не работает должным образом.   -  person Bill Reiss    schedule 20.02.2017
comment
Убедитесь, что эмулятор имеет доступ к Интернету, открыв браузер эмулятора и зайдя на любой веб-сайт (например, google.com).   -  person pinedax    schedule 20.02.2017
comment
Я понял, еще раз спасибо!   -  person Gabriel Gomes    schedule 20.02.2017


Ответы (3)


пакеты nuget: клиентские библиотеки Microsoft HTTP и Newtonsoft.Json.

попробуй это:

private HttpClient client = new HttpClient();
private List<Movie> movies;

public async Task<List<Movie>> LocalizaFilmesPorAtor(string ator)
{

    if (string.IsNullOrWhiteSpace(ator))
    {
        return null;
    }
    else
    {
     var client = new HttpClient(); 
     client.BaseAddress = new Uri("http://netflixroulette.net/");
     HttpResponseMessage response = client.GetAsync("api/api.php?actor={0}", ator);
        if(response.IsSuccessStatusCode)
        {
         var json = response.Content.ReadAsStringAsync().Result;
         var _movies = JsonConvert.DeserializeObject<List<Movie>>(json);
         movies = new List<Movie>(_movies);

        }
        else
        {

            movies = new List<Movie>();
        }

        return movies;
    }
}

PS: если movies = new List(_movies) не работает, попробуйте foreach.

person Jonathan Braga    schedule 20.02.2017
comment
Давая ответ, желательно дать некоторое объяснение, ПОЧЕМУ именно ваш ответ. - person Stephen Rauch; 20.02.2017
comment
Извините, я здесь новенький, в следующий раз сделаю лучше. - person Jonathan Braga; 20.02.2017
comment
На самом деле вы могли бы сделать лучше прямо сейчас. Чуть ниже вашего поста с левой стороны есть ссылка edit. Не стесняйтесь редактировать, чтобы улучшить ситуацию здесь. Ваше здоровье. - person Stephen Rauch; 20.02.2017
comment
Что лучше/отличается от этого решения? - person maracuja-juice; 12.07.2017

Почему вы не можете попробовать Refit? Refit — это библиотека, вдохновленная библиотекой Square Retrofit, которая превращает ваш REST API в живой интерфейс.

Что вам просто нужно сделать, это:

  1. Добавить переоснащение из пакета Nuget
  2. Создайте интерфейс с любым именем
  3. Импортировать переоснащение (используя переоснащение)

вот пример кода интерфейса

public interface ISampleName
{

    [Get("api/api.php?actor={ator}")]
    async Task<List<Movie>> LocalizaFilmesPorAtor(string ator);
}

После этого вы можете называть это так:

var SampleNameApi = RestService.For<ISampleName>("http://netflixroulette.net/");

var response= await SampleNameApi.LocalizaFilmesPorAtor("Sample");

Я верю, что это поможет вам.

Для получения дополнительной информации https://github.com/paulcbetts/refit

person Biola Cashmoney Bakare    schedule 14.03.2017

У меня тоже была эта проблема, потому что мой URL-адрес был искажен. Дважды проверьте правильность вашего URL-адреса с помощью Postman/Browser.

person maracuja-juice    schedule 12.07.2017