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