10

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

4

2 回答 2

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()

于 2008-09-02T13:06:11.263 回答
3

不,不是的。但是如果 URL 的协议是 HTTP,你会得到一个HttpURLConnection作为返回对象。此类有一个setRequestMethod方法来指定您要使用的 HTTP 方法。

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

于 2008-09-02T12:55:59.073 回答