2017-01-06 11 views
4

Я использую java.net для отправки HTTP-запросов в моем Java-клиенте, и я до сих пор не могу понять/найти, как реально запустить запрос.java.net Как запустить HTTP-запрос

Например, у меня есть этот код:

Scanner sc = new Scanner(System.in); 

System.out.println("Deleting subject..."); 
System.out.println("Subject shortcut (-1 for return):"); 
String shortcut = sc.next(); 
if(shortcut.equals("-1")) 
    return ; 

try 
{ 
    URL url = new URL("http://localhost:8080/Server/webresources/subject/delete/"+shortcut); 
    HttpURLConnection con = (HttpURLConnection)url.openConnection(); 
    con.setDoOutput(true); 
    con.setRequestMethod("DELETE"); 

    BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream())); 
    System.out.println(br.readLine()); 
}catch(Exception e) 
{ 
    System.out.println(e.getMessage()); 
} 

В этом коде, если я не использую эти строки:

BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream())); 
System.out.println(br.readLine()); 

запрос никогда не передается. Поэтому в этом случае запрос кажется триггером, вызвав InputStream из соединения.

Может ли кто-нибудь объяснить мне, как HTTP-запрос через java.net запущен?

+0

Возможный дубликат [Использование java.net.URLConnection огонь и обрабатывать HTTP-запросы] (http://stackoverflow.com/questions/2793150/using-java-net-urlconnection-to-fire-and -handle-http-запросы) – Michael

+1

Первый ответ на этот вопрос идет довольно подробно. В принципе, вы правы, что запрос отправляется при чтении из входного потока. – Michael

+1

@Michael URLConnection # connect() как написано в теме, которую вы только что опубликовали, не работает. – scarface

ответ

5

Из документации подключается HttpURLConnection, если вы вызываете connect(), или если вы вызываете операцию, которая зависит от подключения, например getInputStream().

открывает линию связи к ресурсу, на которое ссылается URL, если такая связь еще не была установлена. Если вызов метода вызывается, когда соединение уже открыто (обозначено подключенным полем, имеющим значение true), вызов игнорируется.

Объекты URLConnection проходят через две фазы: сначала они создаются, , после чего они подключены. После создания и до подключения могут быть указаны различные параметры (например, doInput и UseCaches). После подключения, это ошибка, чтобы попытаться установить их. Операции, которые зависят от подключения, как и getContentLength, будет неявно выполнять подключение, если необходимо.

Однако несколько тем показывают, что connect() не совершит фактический запрос, но getInputStream() (и, скорее всего, любой метод чтения сервера ответа, например getResponseCode()) будет:

Java URLConnection - When do I need to use the connect() method?

Why does HttpURLConnection not send the HTTP request

How to send PUT, DELETE HTTP request in HttpURLConnection?

+0

К сожалению, если я назову 'connect()', то происходит nohing. – scarface

+0

@scarface: это странно, но вы должны быть правы, так как в комментариях из следующего раздела указано то же самое: http://stackoverflow.com/questions/1051004/how-to-send-put-delete-http-request -in-httpurlconnection – Berger

+0

Я собираюсь проверить эти темы. Во всяком случае, странно получать InputStream, когда в некоторых случаях я фактически не получаю никакого вывода с сервера. Кстати, когда я запрашиваю номер ответа, запрос отправляется. – scarface

0

Новый экземпляр URLConnection создается каждый раз при вызове метода обработчика протокола URLStreamHandler.openConnection(URL) для этого URL-адреса.

Следует отметить, что экземпляр URLConnection не устанавливает фактическое сетевое соединение при создании. Это произойдет только при вызове URLConnection.connect(). see javadoc

String url = "http://example.com"; 

    URL obj = new URL(url); 
    HttpURLConnection con = (HttpURLConnection) obj.openConnection(); 

    con.setRequestMethod("GET"); 

    //add request header 
    con.setRequestProperty("User-Agent", USER_AGENT); 

    int responseCode = con.getResponseCode(); 
+0

Это круто, но это не ответило на мой вопрос. Вместо того, чтобы получать InputStream, я получаю responseCode, и все. Это не объяснение. – scarface