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