java.net如何触发HTTP请求

时间:2017-01-06 14:37:12

标签: java httprequest

我正在使用java.net在我的Java客户端发送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来触发的。

任何人都可以解释一下如何通过java.net发出HTTP请求吗?

2 个答案:

答案 0 :(得分:5)

从文档中,如果您拨打connect(),或者如果您调用依赖于连接的操作,HttpURLConnection将会连接getInputStream()

  

打开指向此网址引用的资源的通讯链接,如果   这种联系尚未建立。如果连接   连接已被打开时调用方法   (由具有值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?

答案 1 :(得分:0)

每次调用此URL的协议处理程序的URLStreamHandler.openConnection(URL)方法时,都会创建一个新的URLConnection实例。

应该注意,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();