【问题标题】:Xamarin HttpClientXamarin HttpClient
【发布时间】:2017-02-19 20:45:27
【问题描述】:

我正在使用 Xamarin Forms 从 NetFlix 使用 REST Api,但我在弹出窗口中遇到了这个问题: System.Net.WebException:错误: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:我在 Manifest 中允许我的应用程序上网!

【问题讨论】:

  • NameResolutionFailure 通常表示 DNS 问题。您是否确认可以从设备的浏览器加载该网站?
  • 当 URL 失败时,在浏览器中检查 URL。有时它是站在他们一边而不是你一边。在编码中添加错误捕获的更多理由
  • 在android模拟器中我经常遇到这种情况,有时网桥无法正常启动。
  • 确保模拟器可以访问互联网,打开模拟器浏览器并访问任何网站(google.com par example)。
  • 我知道了,再次感谢!

标签: android xamarin.ios xamarin.forms androidhttpclient


【解决方案1】:

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。

【讨论】:

  • 在给出答案时,最好给出some explanation as to WHY your answer
  • 对不起,我是新人,下次我会做得更好。
  • 您现在实际上可以做得更好。在左侧您的帖子下方是一个edit 链接。不要羞于编辑以改善这里的情况。干杯。
  • 这个解决方案有什么更好/不同之处?
【解决方案2】:

你为什么不能试试改装? 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

【讨论】:

    【解决方案3】:

    我也遇到了这个问题,因为我的网址格式不正确。使用 Postman/Browser 仔细检查您的 URL 是否正确。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多