2016-02-21 4 views
1

Мне интересны только коды ответов HTTP (2xx, 3xx, 4xx & 5xx) для нескольких сайтов.Лучший способ получить код ответа HTTP в кодовом имени один

Мой текущий код хорошо работает в кодовом имени одного симулятора. Но как приложение на 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) 
+0

«EOFException» появляется только при отправке запроса «HEAD». При использовании запросов GET я получаю правильный код ответа. Я бы предпочел использовать запросы 'HEAD', потому что я просто заинтересован в коде ответа HTTP и не нуждаюсь в данных тела HTTP. – ryru

+0

Можете ли вы подключить устройство с помощью кабеля и запустить инструмент DDMS из SDK android. Затем добавьте трассировку стека для 'EOFException' к вопросу? –

+0

Спасибо, Шай, ты здесь. Я относительно новичок в мобильном программировании, надеюсь, что правильно понимаю ваш запрос. – ryru

ответ

0

Это из-за этого известного Android ошибка: Android's HttpURLConnection throws EOFException on HEAD requests

Мы добавим, что обходной путь в Codename One так все должно «просто работать».

+0

Спасибо Shai. Не могли бы вы сообщить нам, когда вы применили обходной путь, чтобы я мог отметить этот ответ правильно? Согласны ли вы со второй частью вопроса о том, что рекомендуемый способ читать коды ответов HTTP находится в 'readResponse' с' setReadResponseForErrors (true) '? – ryru

+0

Должно быть, теперь новые сборки должны включать исправление. 'ReadResponseForErrors' означает, что мы будем называть' readResponse', даже если есть код ошибки. Я не уверен, что это имеет большой смысл для запроса 'head', но если он работает для вас, тогда все должно быть хорошо. –

+0

Спасибо, Shai за вашу быструю помощь, кажется, отлично работает сейчас. Потому что мой вариант использования - это только код ответа HTTP, имеет смысл просто запросить сообщение «HEAD». – ryru

1

У вас есть подключение к Интернету в мобильном телефоне? Хост доступен с мобильным телефоном?

+0

Спасибо tizbn. Да, у меня есть активное интернет-соединение, и сайты, о которых идет речь, также доступны. – ryru

Смежные вопросы