HTTP网络请求过程几点说明

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/gongsunjinqian/article/details/51597476


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();
}




展开阅读全文

没有更多推荐了,返回首页