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

时间:2020-03-05 18:46:24  来源:igfitidea点击:

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

解决方案

回答

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

如果我们想做更复杂的事情,最好使用Jakarta HttpClient之类的库。

回答

如果使用" openConnection()"检索" URLConnection"对象,则它实际上不会开始与服务器进行通信。直到从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

尽管这样做可以获取:

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(),也可能存在这种情况。