HTTP网络请求过程几点说明


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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值