HttpURLConnection

2016-06-15  本文已影响165人  jockerMe

URLConnection 对于HTTP (RFC 2616) 用来发送和接受web数据,数据可以是任意类型以及任意长度。这个类可以被用来发送以及接受事先未知长度的流数据。

使用这个类遵循以下模式:

  1. 通过调用URL.openConnection() 并且强制将结果转换为HttpURLConnection,获取一个新的HttpURLConnection实例。
  2. 准备请求,主要的请求属性是URI,请求头也应该包括元数据例如证书,内容类型,cookie会话。
  3. 可选上传一个请求体。如果需要包含一个请求体,使用setDoOutput(true)配置实例。通过向getOutputStream()返回的stream写入发送数据。
  4. 读取相应。响应头通常包括元数据例如响应体的内容类型和长度,修改日期和cookies会话。这个响应体可以通过getInputStream()返回的stream读取数据。如果相应没有响应体,将会返回一个空的stream。
  5. 断开链接。一旦相应体被读取,HttpURLConnection应该通过调用disconnect()关闭。Disconnecting释放了被connection占用的资源,以便关闭或者重新使用。
URL url = new URL("http://www.android.com/");
HttpURLConnection urlConnection =(HttpURLConnection) url.openConnection();
try{
InputStream in = new BufferedInputStream(urlConnection.getInputStrea m());
readStream(in);
finally{
urlConnection.disconnect();
}
}

Secure Communication with HTTPS
调用openConnection() 在一个URL 使用 "https"模式,将会返回一个HttpsURLConnection,允许重写默认的HostnameVerifier和SSLSocket-Factory。

Response Handing
HttpURLConnection 将会跟随 five HTTP redirects。它将会跟随从源服务到另一个的从的重定向,此实现不遵循冲HTTPS到HTTP的重定向。
如果HTTP相应遇到了一个错误,getInputStream()将会抛出一个IOException。使用getErrorStream去读写错误响应。通过调用getHeaderFields()将会正常读取headers

Posting Content
上传数据到web server,使用setDoOutput(true)配置输出链接。
为了实现最好的性能,你也可以调用setFixedLengthStreamMode(int)当这个body长度事先知道,或者在不知道body长度时调用setChunkedStreamingMode(int)。否则HttpURLConnection将会被强制在内存中缓冲所有的请求体在他提交之前。浪费内存堆增加了延迟。

HttpURLConnection UrlConnection = (HttpURLConnection) url.openConnection();
try{
  urlConnection.setDoOutput(true);
  urlConnection.setChunkedStreamingMode(0);
  
  OutputStream out = new BufferedOutPutStream(urlConnection.getOutputStream());
writeStream(out);

  InputStream in = new BufferedInputStream(urlConnection.getInputStream());
  readStream(in);
 finally{
  urlConnection.disconnect();
}
}

设置链接参数的方法:

设置请求或响应头:
Http请求允许一个key带多个用逗号分开的values,但是HttpURLConnection只提供了单个操作方法

发送URL请求:
建立实际链接之后,就是发送请求,把请求参数传到服务器,这就需要使用outputStream把请求参数传给服务器:

获取响应:
请求发送成功之后,即可获取响应的状态码,如果成功,可以获取响应中的数据,获取这些数据的方法包括:

对于大部分请求来说,getInputStream和getContent用的是最多的。
相应的信息头用以下方法获取:

上一篇下一篇

猜你喜欢

热点阅读