【问题标题】:Host name may not be null in HttpResponse execute for android在 HttpResponse 中执行 android 时主机名可能不为空
【发布时间】:2012-09-21 20:08:14
【问题描述】:

我收到错误“目标主机不能为空,或在参数中设置”。

  • 我确实在我的清单文件中有 Internet 权限
  • 我在我的网址前添加了“http://”
  • 我愿意对网址进行编码

这是我的代码:

   String url = "http://maps.google.com/maps/api/directions/json?origin=1600 Pennsylvania Avenue NW, Washington, DC 20500&destination=1029 Vermont Ave NW, Washington, DC 20005&sensor=false";
   HttpClient httpclient = new DefaultHttpClient();
   String goodURL = convertURL(url);//change weird characters for %etc
   HttpPost httppost = new HttpPost(goodURL);
   HttpResponse response = httpclient.execute(httppost);

在第 5 行(上面的最后一行),我的程序抛出异常。这是确切的错误:

java.lang.IllegalArgumentException: Host name may not be null

我确实在方法 convertURL 中对我的字符串进行编码...

goodURL= http://maps.google.com/maps/api/directions/json?origin=3%20Cedar%20Ave%2c%20Highland%20Park%2c%20NJ%2008904&destination=604%20Bartholomew%20Road%2c%20Piscataway%2c%20New%20Jersey%2008854&sensor=false

有什么建议吗? 谢谢!

【问题讨论】:

  • 网址中不能有空格!让我看看你是如何编码你的 URL 的
  • 您的问题可能出在您的 convertURL 函数中...使用调试器并检查返回的内容。
  • 嗨!我传递了整个 URL,我修改了它,但它仍然给我错误... goodURL= http://maps.google.com/maps/api/directions/json?origin=3%20Cedar%20Ave%2c%20Highland%20Park%2c%20NJ%2008904&destination=604%20Bartholomew%20Road%2c%20Piscataway%2c%20New%20Jersey%2008854&sensor=false
  • 好的,你们是对的!我正在传递整个 URL...我修复了它,但现在它给了我这个异常! android.os.NetworkOnMainThreadException 但我可以研究一下这是什么意思...谢谢!

标签: android http-post httpresponse illegalargumentexception


【解决方案1】:

我不确定你的 URL 编码方法在做什么,但如果你使用框架中的方法,如 URLEncoder你不应该传递完整的 URL,只传递参数列表您需要编码以转义特殊字符。

对完整 URL 进行编码会百分比转义每个字符,包括将 :// 转义为 %3A%2F%2F 以及将所有其他斜杠转义为 %2F

在编码后查看goodUrl 字符串的值。

【讨论】:

  • 嗨!我传递了整个 URL,我对其进行了修改,但它仍然给我一个错误.... goodURL 是 http://maps.google.com/maps/api/directions/json?origin=3%20Cedar%20Ave%2c%20Highland%20Park%2c%20NJ%2008904&destination=604%20Bartholomew%20Road%2c%20Piscataway%2c%20New%20Jersey%2008854&sensor=false
  • 好的,你们是对的!我传递了整个 URL...我修复了它,但现在它给了我这个异常! android.os.NetworkOnMainThreadException 但我可以研究一下这是什么意思...谢谢!
  • "NetworkOnMainThreadException" 的意思正是它所说的。 Android 不允许你从主线程进行网络访问,因为它会阻塞 UI;您必须为网络 I/O 创建一个后台线程。您可以从这篇培训文章中了解更多信息:developer.android.com/training/basics/network-ops/index.html
【解决方案2】:

只需使用:

URLEncoder.encode(YOUR_STRING);

【讨论】:

    【解决方案3】:

    在您发布请求之前对您的 URL 字符串进行编码,但只对 ? 后面的参数进行编码:

    String url = "http://maps.google.com/maps/api/directions/json?";
    String params = "origin=1600 Pennsylvania Avenue NW, Washington, DC 20500&destination=1029 Vermont Ave NW, Washington, DC 20005&sensor=false";
    HttpClient httpclient = new DefaultHttpClient();
    String goodParams = convertURL(params);//change weird characters for %etc
    HttpPost httppost = new HttpPost(url + goodParams);
    HttpResponse response = httpclient.execute(httppost);
    

    【讨论】:

    • 我想知道 URLEncode 是否正在对该字符串中的所有内容进行编码,包括主机名。在上面的示例中,goodURL 是什么样的?尝试使用 URL 对象而不是字符串,并在其中设置主机名和资源。
    • 嗨!我传递了整个 URL,我修改了它,但它仍然给我一个错误.... goodURL 是 http://maps.google.com/maps/api/directions/json?origin=3%20Cedar%20Ave%2c%20Highland%20Park%2c%20NJ%2008904&destination=604%20Bartholomew%20Road%2c%20Piscataway%2c%20New%20Jersey%2008854&sensor=false
    • 好的,你们是对的!我传递了整个 URL...我修复了它,但现在它给了我这个异常! android.os.NetworkOnMainThreadException 但我可以研究一下这是什么意思...谢谢!
    • NetworkOnMainThreadException 当您尝试在主线程上进行网络调用时抛出,因为这会影响 UI 的响应性并导致糟糕的用户体验。您需要在后台线程中处理发送和接收。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 2020-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    • 2014-06-18
    相关资源
    最近更新 更多