Java — HttpURLConnection

#java #httpurlconnection

#java #httpurlconnection

Вопрос:

Привет, я начал использовать HttpUrlConnection , и у меня есть вопрос относительно того, когда фактически отправляется Http-запрос.

Я где-то читал, что фактический запрос отправляется при getInputStream() вызове. Тем не менее, я написал некоторый тестовый код, чтобы поиграть с этим для запроса POST:

В этой версии я обращаюсь к getResponseCode() before getInputStream()

 URL obj = new URL(myUrl);
HttpURLConnection httpclient = (HttpURLConnection) obj.openConnection();
httpclient.setRequestMethod("POST");
**int responseCode = httpclient.getResponseCode();** 
    try { 
        inStream = httpclient.getInputStream(); 
    }
    catch (IOException ie) { 
        inStream = httpclient.getErrorStream(); 
    }
System.out.println("response code = "   responseCode);
 

Я получаю код ответа 200. Итак, это заставило меня задуматься, что запрос отправляется не в getInputStream(), а в более раннем методе. У кого-нибудь есть какое-либо представление об этом?

Спасибо!

Ответ №1:

Анализ кода для HttpURLConnection#getResponseCode() — OpenJDK 7

 public int getResponseCode() throws IOException {
454        /*
455         * We're got the response code already
456         */
457        if (responseCode != -1) {
458            return responseCode;
459        }
460
461        /*
462         * Ensure that we have connected to the server. Record
463         * exception as we need to re-throw it if there isn't
464         * a status line.
465         */
466        Exception exc = null;
467        try {
468            getInputStream();
469        } catch (Exception e) {
470            exc = e;
471        }
472        ...
 

В основном response code будет -1 при инициализации, что означает, что мы не получили никакого кода ответа. Таким образом, он установит соединение URL#getInputStream() и получит код ответа.

Комментарии:

1. Это действительно так, если прочитать исходный код java.net.HttpURLConnection в JDK8. После этого он считывает строку состояния из заголовка и получает код.

2. ммм… На самом деле это устанавливает соединение.

3. Итак, по сути, именно getInputStream() будет устанавливать соединение / отправлять запрос? Похоже, что getResponseCode() использует getInputStream для установления соединения.

Ответ №2:

getResponseCode() делает то же самое: сбрасывает запрос и начинает чтение ответа.

На самом деле, вы ДОЛЖНЫ попытаться начать чтение ответа (кода или потока), чтобы запрос был полностью отправлен на сервер.

Комментарии:

1. Итак, getResponseCode() и getInputStream() оба сбрасывают запрос? в моем коде я закомментировал getResponseCode() , поэтому я никогда не вызываю getResponseCode. Тем не менее, я все еще получаю правильное response…so требуется ли getResponseCode для полной отправки запроса?

2. Либо одно, либо другое