1、Android发送HTTP请求工具类主要有:HttpClient(如:DefaultHttpClient,AndroidHttpClient)和 URLConnection(如:HttpUrlConnection)。
而这两者并非相互独立的关系。比如:HttpUrlConnection的writeRequests方法,调用的是HttpClient的writeRequests方法,或许应该区分哪个包下的HttpUrlConnection或HttpClient来解释关系。
另外,从源码上看,HttpClient中的openServer用的是socket的getOutputStream方法。所以可以说,java的http请求(无论HttpClient还是HttpUrlConnection)底层是用socket实现的。
2、HttpUrlConnection提供的getOutputStream方法会检查连接状态,若未连接会调用connect方法。
if(!this.checkReuseConnection()) { this.connect(); }所以在存在getOutputStream方法的情况下,可以不调用connect方法。
3、HttpUrlConnection要求一些设置要在建立连接之前(即,connect之前)完成设置。
如:
setDoOutput
setDoInput
setRequestMethod
setUseCaches
setConnectTimeout
说一下setDoOutput方法,这个属性默认值是false,那么getOutputStream是无效的,所以这个方法需要设置为true。
而,setDoInput,这个属性默认是true,是控制getInputStream方法是否有效的。
setRequestMethod方法的参数值可以为:
/** * The subset of HTTP methods that the user may select via {@link * #setRequestMethod(String)}. */ private static final String[] PERMITTED_USER_METHODS = { "OPTIONS", "GET", "HEAD", "POST", "PUT", "DELETE", "TRACE" // Note: we don't allow users to specify "CONNECT" };
4、在获取输出流对象(OutputStream)时,通常使用DataOutputStream工具类来管理:
DataOutputStream out = new DataOutputStream(urlConn.getOutputStream()); //将要上传的内容写入流中 out.write(params.getBytes("UTF-8"));其实urlConn.getOutputStream().write(params.getBytes("UTF-8"))同样可以,只不过DataOutputStream工具类多了一个size()方法,其内部依然是调OutputStream里的方法。
5、接受输入流时,我们通常使用两个工具类进行转换,先用InputStreamReader将urlConn.getInputStream()的字节流转换成字符流,然后在通过BufferedReader的readLine方法读取字符流。
InputStreamReader本身只能读成char[]数据;而BufferedReader有readLine方法可以读成String数据。使我们的操作更简便,否则我们需要自己实现char[]转String。
6、HttpUrlConnection提供添加请求Header和获取返回Header的方法。
urlConn.addRequestProperty(headerName, map.get(headerName));
for (Map.Entry<String, List<String>> header : urlConn.getHeaderFields().entrySet()) { if (header.getKey() != null) { } }
7、Get请求不需要getOutputStream方法,所以setOutputStream可以不设置。Get请求,建立连接可以通过getInputStream方法执行connect方法。
类似于getOutputStream方法,getInputStream同样也有以下判断。
if(!this.checkReuseConnection()) { this.connect(); }