新的URL(...)。openConnection()是否必然意味着POST?

时间:2008-09-02 12:37:27

标签: java http url

如果我创建了一个HTTP java.net.URL,然后在其上调用openConnection(),那么它是否一定意味着HTTP帖子会发生?我知道openStream()意味着GET。如果是这样,如何在不使用原始套接字层的情况下执行其他HTTP谓词之一?

2 个答案:

答案 0 :(得分:16)

如果使用URLConnection检索openConnection()对象,它实际上并不开始与服务器通信。直到您从URLConnection()获得流后才会发生这种情况。当您第一次获得连接时,您可以在实际打开它之前添加/更改标题和其他连接属性。

URLConnection的生命周期有点奇怪。在您获得其中一个流之前,它不会将标头发送到服务器。如果您只是获取输入流,那么我相信它会执行GET,发送标题,然后让您读取输出。如果你得到了输出流,那么我相信它会把它作为POST发送,因为它假设你要向它写入数据(你可能需要调用setDoOutput(true)来使输出流工作)。一旦获得输入流,输出流就会关闭,并等待服务器的响应。

例如,这应该执行POST:

URL myURL = new URL("http://example.com/my/path");
URLConnection conn = myURL.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);

OutputStream os = conn.getOutputStream();
os.write("Hi there!");
os.close();

InputStream is = conn.getInputStream();
// read stuff here

虽然这会做GET:

URL myURL = new URL("http://example.com/my/path");
URLConnection conn = myURL.openConnection();
conn.setDoOutput(false);
conn.setDoInput(true);

InputStream is = conn.getInputStream();
// read stuff here

URLConnection也会做其他奇怪的事情。如果服务器指定了内容长度,则URLConnection将保持基础输入流打开,直到它收到那么多数据,即使您明确关闭它。这给我们带来了很多问题,因为它使我们的客户端干净地关闭,因为URLConnection将保持网络连接打开。即使您只使用getStream(),这可能也可能存在。

答案 1 :(得分:3)

不,不。但是,如果URL的协议是HTTP,您将获得HttpURLConnection作为返回对象。此类具有setRequestMethod方法,用于指定要使用的HTTP方法。

如果你想做更复杂的事情,你可能最好使用像Jakarta HttpClient这样的库。