【发布时间】:2010-09-07 13:15:02
【问题描述】:
如果我创建一个 HTTP java.net.URL,然后在其上调用 openConnection(),这是否一定意味着 HTTP 帖子将要发生?我知道openStream() 意味着 GET。如果是这样,您如何在不使用原始套接字层的情况下执行其他 HTTP 动词之一?
【问题讨论】:
如果我创建一个 HTTP java.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
虽然这会做一个 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(),这也可能存在。
【讨论】: