#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. Либо одно, либо другое