如何使用java.net发送HTTP请求

4

我在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触发的。

有人能解释一下如何通过java.net发起HTTP请求吗?


可能是使用java.net.URLConnection发送和处理HTTP请求的重复问题。 - Michael
1
那个问题的第一个答案详细地解释了这个过程。基本上,当你从输入流中读取数据时,请求就会被发送。 - Michael
1
@Michael,你刚才发布的主题中写的URLConnection#connect()方法不起作用。 - scarface
@Michael,你所说的内容已经在那里写着了,但是如果我不想要任何响应怎么办?那么我就不想读取,也不想创建一个 BufferedReader。 - scarface
1
很多内容都在基类的javadocs中:https://docs.oracle.com/javase/8/docs/api/java/net/URLConnection.html(尽管它没有写得非常清楚) - yshavit
2个回答

5
从文档中可以看出,HttpURLConnection会在调用connect()或者调用依赖于连接的操作(如getInputStream())时进行连接。

如果尚未建立此URL引用的资源的通信链接,则打开到该资源的通信链接。如果在已经打开了连接的情况下调用connect方法(由connected字段的值为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?

不幸的是,如果我调用connect(),什么也不会发生。 - scarface
@scarface: 这很奇怪,但是既然下面话题的评论都说了同样的事情,那你肯定是对的:https://dev59.com/bHNA5IYBdhLWcg3wNa-T - Arnaud
我将会检查这些主题。但在某些情况下,从服务器没有获得任何输出时获得InputStream很奇怪。另外,当我请求响应号码时,请求也会被发送。 - scarface
1
@scarface:是的,似乎无论如何,您都必须从服务器读取一些内容(输入流、响应代码、内容长度等)。无论您的请求是什么,读取响应代码都是有意义的。 - Arnaud

0
每次调用此URL的协议处理程序的URLStreamHandler.openConnection(URL)方法时,都会创建一个新的URLConnection实例。
需要注意的是,创建URLConnection实例时不会建立实际的网络连接。只有在调用URLConnection.connect()时才会发生这种情况。{{link2:请参阅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();

这很酷,但它没有回答我的问题。我得到的不是InputStream,而是responseCode,仅此而已。那不是一个解释。 - scarface

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接