2008-09-02 65 views

回答

16

如果使用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()

3

不,它不。但是如果URL的协议是HTTP,那么您将得到一个HttpURLConnection作为返回对象。该类使用setRequestMethod方法来指定要使用的HTTP方法。

如果你想做更复杂的东西,你可能最好使用像Jakarta HttpClient这样的库。