首先,HttpURLConnection应该算是HttpClient的替换者,度娘说HttpClient是对于HttpURLConnection的封装,这里由于不能拜读源码,所以没有办法验证,但是HttpClient确实有那么一点封装的意思。
---------HttpClient链接地址-----------
介绍:HttpURLConnection是一个和服务器servlet交互的轻量级组件,它是基于socket层的请求层API。
二者的区别:
1.首先,HttpClient是属于org.apache.http包下的各个Api,而HttpURLConnection是java.net下的组件,二者有着本质的区别,Httpclient拥有众多Api、BUG较少、实现稳定,这使得它的可维护和扩展性降低,所以Android团队更新它的积极性较低。并且在Android2.3及之后更推荐使用HttpURLConnection。Android5.1中HttpClient已成过时。
2.HttpClient封装性高,使用简单。而HttpURLConnection是一个轻量级的组件,它的可扩展性高。
这两种方式都支持HTTPS协议、以流的形式进行上传和下载、配置超时时间、IPv6、以及连接池等功能
HttpURLConnection的优势:API简单、体积较小,所以非常适用于Android项目。压缩和缓存机制可以有效地减少网络访问的流量,在提升速度和省电方面也起到了较大的作用。
执行顺序:
验证自Debug,由于没有UML,只能用画图工具(真难用啊!),如图:
----------------------------------------我是华丽的分割线---------------------------------------------
HttpURLConnection urlConnection=null;
//创建URL(统一资源定位器)对象
URL u=new URL(url);
//获得一个URLConnection(可设定代理),并没有链接服务器
urlConnection=(HttpURLConnection)u.openConnection();
//设置超时
urlConnection.setConnectTimeout(30000);
urlConnection.setReadTimeout(30000);
//设置请求的方式
urlConnection.setRequestMethod("POST");
urlConnection.setDoInput(true);//设置是否从网络读取数据
urlConnection.setDoOutput(true);//设置是否向网络发出数据请求
//设置处理请求参数的字符串
StringBuffer body = new StringBuffer();
if(params != null && !params.isEmpty()){
Set<Entry<String,String>> entites = params.entrySet();
boolean isFirst = true;
for(Entry<String, String> entry : entites){
if(!isFirst){
body.append("&");
}
body.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue(),"UTF-8"));
isFirst = false;
}
//创建ObjectOutputStream输出流,输出流基本都可以,这一步才开始联网
ObjectOutputStream obj=new ObjectOutputStream(urlConnection.getOutputStream());
obj.writeBytes(body.toString());
//清空缓冲区,并关闭连接
obj.flush();
obj.close();
}
//如果有session就上传
if(null != JSESSIONID){
urlConnection.setRequestProperty("Cookie", "JSESSIONID="+JSESSIONID);
//req.setHeader("Cookie","JSESSIONID="+JSESSIONID);
}
//判断状态,是否为请求成功(200)
if(urlConnection.getResponseCode() != HttpURLConnection.HTTP_OK){
msg = "服务器繁忙,请稍后重试!";
}
else{
//获得输入流
InputStream is = urlConnection.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[4096];
int ss = 0;
while((ss = is.read(buffer))!=-1){
baos.write(buffer,0,ss);
}
String responseBody = new String(baos.toByteArray(),"UTF-8");
response = new JSONObject(responseBody);
}
//销毁链接
urlConnection.disconnect();
请求方式的区别:
GET:可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet。
POST:参数不是放在URL字串里面,而是放在http请求的正文内。
异常解决:
1.Web服务器出现java.io.EOFExecption的原因是,移动端(安卓)向服务器发送数据的时候对象没有实现序列化,或不能解析。
解决方案:设置urlConnection.setRequestProperty("Content-type","application/x-java-serialized-object");
2.调试的时候总是不过,或请求超时,或得不到数据,可能因为断点的存在。如设置了超时时间后再断点。