HttpURLConnection
URLConnection 对于HTTP (RFC 2616) 用来发送和接受web数据,数据可以是任意类型以及任意长度。这个类可以被用来发送以及接受事先未知长度的流数据。
使用这个类遵循以下模式:
- 通过调用URL.openConnection() 并且强制将结果转换为HttpURLConnection,获取一个新的HttpURLConnection实例。
- 准备请求,主要的请求属性是URI,请求头也应该包括元数据例如证书,内容类型,cookie会话。
- 可选上传一个请求体。如果需要包含一个请求体,使用setDoOutput(true)配置实例。通过向getOutputStream()返回的stream写入发送数据。
- 读取相应。响应头通常包括元数据例如响应体的内容类型和长度,修改日期和cookies会话。这个响应体可以通过getInputStream()返回的stream读取数据。如果相应没有响应体,将会返回一个空的stream。
- 断开链接。一旦相应体被读取,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();
}
}
设置链接参数的方法:
- setAllowUserInteraction
- setDoInput
- setDoOutput
- setlfModifiedSince
- setUseCaches
- setDefaultAllowUserInteraction
- setDefaultUseCaches
设置请求或响应头:
Http请求允许一个key带多个用逗号分开的values,但是HttpURLConnection只提供了单个操作方法
- setRequestProperty(key,value)
- addRequestProperty(key,value)
setRequsetProperty和addRequestProperty的区别就是,setRequsetProperty会覆盖已经存在的key的所有values,有清零重新赋值的作用。而addRequestProperty则是在原来key的基础上继续添加其它value
发送URL请求:
建立实际链接之后,就是发送请求,把请求参数传到服务器,这就需要使用outputStream把请求参数传给服务器:
- getOutputStream
获取响应:
请求发送成功之后,即可获取响应的状态码,如果成功,可以获取响应中的数据,获取这些数据的方法包括:
- getContent
- getHeaderField
- getInputStream
对于大部分请求来说,getInputStream和getContent用的是最多的。
相应的信息头用以下方法获取:
- getContentEncoding
- getContentLength
- getContentType
- getDate
- getExpiration
- getLastModifed