【问题标题】:Best way to get http response code in codename one在代号一中获取 http 响应代码的最佳方法
【发布时间】:2016-02-21 18:18:16
【问题描述】:

我只对多个网站的 HTTP 响应代码(2xx、3xx、4xx 和 5xx)感兴趣。

我当前的代码在代号一的模拟器中运行良好。但作为 Android 上的应用程序,对于某些网站,代码会抛出 EOFExceptions。在这些情况下,我不会收到响应代码。

我该如何解决这个问题?在代号一中获取所有这些 http 返回代码的最佳和推荐方法是什么?

for (final Host h : current_hosts) {

    ConnectionRequest cr = new ConnectionRequest() {


        protected void readResponse(InputStream input) {

            h.setHost_return_code(getResponseCode());

            try {
                String response = Util.readToString(input);
                input.close();
            } catch (IOException err) {
                // do nothing
            }

        }
    };
    cr.setUrl(h.getHost_url());
    cr.setHttpMethod("HEAD");
    cr.setFollowRedirects(false);
    cr.setReadResponseForErrors(true);
    cr.setPost(false);
    cr.setFailSilently(false);
    cr.setSilentRetryCount(2);
    cr.setTimeout(15000);

    NetworkManager.getInstance().addToQueueAndWait(cr);

}

DDMS 堆栈跟踪:

02-22 17:04:19.463: W/System.err(29698): java.io.EOFException
02-22 17:04:19.463: W/System.err(29698):    at java.util.zip.GZIPInputStream.readFully(GZIPInputStream.java:202)
02-22 17:04:19.463: W/System.err(29698):    at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:98)
02-22 17:04:19.463: W/System.err(29698):    at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:81)
02-22 17:04:19.473: W/System.err(29698):    at com.android.okhttp.internal.http.HttpEngine.initContentStream(HttpEngine.java:468)
02-22 17:04:19.473: W/System.err(29698):    at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:666)
02-22 17:04:19.473: W/System.err(29698):    at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:347)
02-22 17:04:19.473: W/System.err(29698):    at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:296)
02-22 17:04:19.473: W/System.err(29698):    at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:503)
02-22 17:04:19.473: W/System.err(29698):    at com.codename1.impl.android.AndroidImplementation.getResponseCode(AndroidImplementation.java:3947)
02-22 17:04:19.473: W/System.err(29698):    at com.codename1.io.ConnectionRequest.performOperation(ConnectionRequest.java:367)
02-22 17:04:19.473: W/System.err(29698):    at com.codename1.io.NetworkManager$NetworkThread.run(NetworkManager.java:269)
02-22 17:04:19.473: W/System.err(29698):    at com.codename1.impl.CodenameOneThread$1.run(CodenameOneThread.java:60)
02-22 17:04:19.473: W/System.err(29698):    at java.lang.Thread.run(Thread.java:841)

【问题讨论】:

  • EOFException 似乎只在发送HEAD 请求时出现。使用 GET 请求时,我得到了正确的响应代码。我更喜欢使用 HEAD 请求,因为我只是对 HTTP 响应代码感兴趣,不需要 HTTP 正文数据。
  • 你能用电缆连接你的设备并从android SDK启动DDMS工具吗?然后将EOFException 的堆栈跟踪添加到问题中?
  • 谢谢 Shai,给你。我对移动编程比较陌生,希望我能正确理解您的要求。

标签: codenameone


【解决方案1】:

您的手机有互联网连接吗? 主机可以通过手机访问吗?

【讨论】:

  • 感谢 tizbn。是的,我确实有一个有效的互联网连接,并且相关网站也可以访问。
【解决方案2】:

这是因为这个已知的 Android 错误:Android's HttpURLConnection throws EOFException on HEAD requests

我们会将这种解决方法添加到 Codename One 中,这样事情就应该“正常工作”。

【讨论】:

  • 谢谢谢。您能否在应用解决方法时告诉我们,以便我可以将此答案标记为正确?您是否同意问题的第二部分,即阅读 http 响应代码的推荐方法是在 readResponsesetReadResponseForErrors(true) 内?
  • 现在应该已经启动了,新版本应该包含修复。 readResponseForErrors 表示即使有错误代码,我们也会调用readResponse。我不确定这对head 请求是否有意义,但如果它对你有用,那应该没问题。
  • 感谢 Shai 的快速帮助,现在看来工作正常。因为我的用例只是 http 响应代码,所以只请求 HEAD 消息是有意义的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多