如果我创建一个 HTTPjava.net.URL
然后调用openConnection()
它,它是否一定意味着一个 HTTP 帖子将会发生?我知道这openStream()
意味着 GET。如果是这样,您如何在不必使用原始套接字层的情况下执行其他 HTTP 动词之一?
2 回答
如果您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()
。
不,不是的。但是如果 URL 的协议是 HTTP,你会得到一个HttpURLConnection
作为返回对象。此类有一个setRequestMethod
方法来指定您要使用的 HTTP 方法。
如果您想做更复杂的事情,最好使用Jakarta HttpClient之类的库。