【问题标题】:Unresolved Host Exception Android未解决的主机异常 Android
【发布时间】:2010-11-02 20:01:36
【问题描述】:

我正在尝试使用以下方法从 Android 应用程序调用 RESTful Web 服务:

HttpHost target = new HttpHost("http://" + ServiceWrapper.SERVER_HOST,ServiceWrapper.SERVER_PORT);
HttpGet get = new HttpGet("/list");
String result = null;
HttpEntity entity = null;
HttpClient client = new DefaultHttpClient();
try {
    HttpResponse response = client.execute(target, get);
    entity = response.getEntity();
    result = EntityUtils.toString(entity);
} catch (Exception e) {
    e.printStackTrace();
} finally {
    if (entity!=null)
        try {
            entity.consumeContent();
        } catch (IOException e) {}
}
return result;

我可以使用 Android Emulator 浏览器和我的机器浏览到地址并查看 xml 结果。我已授予我的应用程序 INTERNET 权限。

我正在使用 eclipse 进行开发。

我看到它提到我可能需要配置代理,但由于我正在调用的 Web 服务位于端口 80 上,这应该没关系吗?我可以用浏览器调用该方法。

有什么想法吗?

【问题讨论】:

  • 除非您的设备位于代理服务器后面,否则代理设置无关紧要。
  • 我就是这么想的。我仍然无法正常工作。

标签: java android rest


【解决方案1】:

我认为问题可能出在第一行:

new HttpHost("http://" + ServiceWrapper.SERVER_HOST,ServiceWrapper.SERVER_PORT);

HttpHost 构造函数需要一个主机名作为其第一个参数,而不是带有 "http://" 前缀的主机名。

尝试删除"http://",它应该可以工作:

new HttpHost(ServiceWrapper.SERVER_HOST,ServiceWrapper.SERVER_PORT);

【讨论】:

    【解决方案2】:

    该错误表示无法通过 DNS 解析 URL。有很多问题可能会导致这种情况。如果您坐在代理后面,则应将其配置为使用。

    HttpHost proxy = new HttpHost(”proxy”,port,”protocol”);
    client.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
    

    还要检查您的 Internet 权限是否如下所示

    <uses-permission android:name=”android.permission.INTERNET”></uses-permission>
    

    因为有时它不能用作空标签。

    还可以查看Emulator Networking 和那里的限制部分

    【讨论】:

    • 我不确定代理设置,因为我只访问端口 80,并且模拟器的浏览器可以调用网络服务。
    • 这是为我做的,当使用普通的 HttpGet("http://host/path"); - Eclipse 似乎没有放入这个 XML 标记。谢谢!
    • 也为我工作。
    【解决方案3】:

    我会仔细检查网络权限是否设置正确。尝试一些基本的东西,比如

    String address -"http://www.google.com";
    URL url = new URL(address);             
    InputStream in = url.openStream();
    

    验证您的权限设置是否正确。

    之后,使用您最喜欢的协议分析器(我是一个 wireshark 粉丝)来确定您是否发送了正确的数据包。我相信您需要将完整的 URL 传递给 HTTPGet,但我只有大约 80% 的把握。

    【讨论】:

    • 对,我可以用这个方法取回数据。但是我无法弄清楚为什么原始代码不起作用。我也没有在 Fiddler 中看到任何东西!
    • 此方法是调用 REST Web 服务的有效方法吗? IE。将输入流转化为字符串?
    • 这是一种非常简单的方法,但根据您的操作可能就足够了。我不熟悉提琴手,但我不确定它是否与数据包嗅探器相同。我猜 URL 或主机是错误的。我会尝试传入完整的 URL(“http://”+ ServiceWrapper.SERVER_HOST+“//list”),看看是否有帮助。
    • Fiddler 是一个 Web 调试代理(即用于分析 HTTP 流量的 HTTP 代理服务器),因此不是数据包嗅探器。
    【解决方案4】:

    更改代码中的第一行:

    HttpHost(ServiceWrapper.SERVER_HOST,ServiceWrapper.SERVER_PORT);
    

    【讨论】:

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