2013年末,刚刚开始学android开发的时候,都是使用HttpURLConnection和HttpClient来进行网络访问的,现在网上一搜索开源的网络访问框架一大堆,比如、、、等等。那么HttpURLConnection和HttpClient有什么区别呢?
android支持TCP和UDP通信,但是应用程序大部分网络调用都是通过建立tcp之上的http请求完成的。android 提供了两个的http通信的API,就是apache的HttpClient和java的HttpUrlConnection,其实两种都是提供相同的功能。
是继承的抽象类,是标准的java接口,比较轻量,使用大多数的应用程序。
使用进行http请求:
/* *
* Get方式发送请求
*/
public Object sendGETRequest(String path, Mapparams,String ecoding) throws Exception{
StringBuilder url = new StringBuilder(path);
url.append("?");
for (Map.Entryentry : params.entrySet()) {
url.append(entry.getKey()).append("=");
url.append(URLEncoder.encode(entry.getValue(), ecoding));
url.append("&");
}
url.deleteCharAt(url.length() - 1);
HttpURLConnection conn = (HttpURLConnection) new URL(url.toString())
.openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");
if (conn.getResponseCode() == 200) {
String sessionid = HttpUtils.queryStringForGet(url.toString());
InputStream inStream = conn.getInputStream();
return inStream;
}
return null;
}
/* *
* POST方式发送请求
*/
public Object sendPOSTRequest(String path,Mapparams, String encoding) throws Exception {
StringBuilder data = new StringBuilder();
if (params != null && !params.isEmpty()) {
//搭建post访问路径
for (Map.Entryentry : params.entrySet()) {
data.append(entry.getKey()).append("=");
data.append(URLEncoder.encode(entry.getValue(), encoding));
data.append("&");
}
data.deleteCharAt(data.length() - 1);
}
byte[] entity = data.toString().getBytes();
HttpURLConnection conn = (HttpURLConnection) new URL(path).openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod("POST");
conn.setDoOutput(true);// 允许对外输出
conn.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
conn.setRequestProperty("Content-Length", String.valueOf(entity.length));
OutputStream outputStream = conn.getOutputStream();
outputStream.write(entity);
if (conn.getResponseCode() == 200) {
InputStream inStream = conn.getInputStream();
return inStream;
}
return null;
}
是apache公司提供的http协议库,功能比较丰富,对http进行封装和处理,所以比较难扩展。
/*
* 通过url发送get请求,第一次请求后保存sessionID
*/
public static String queryStringForGet(String url){HttpGet httpGet = new HttpGet(url);
//实例化HttpGet对象
String result = null;
if (null!=JSPSESSID) {
//判断sessionid是否为空,不为空就将jspsessionid的值放到cookie中发送给服务器httpGet.setHeader("Cookie","JSPSESSID="+JSPSESSID);}
//实例化连接
DefaultHttpClient httpClient = new DefaultHttpClient();
try {
//实例化返回结果
HttpResponse response = httpClient.execute(httpGet);
//返回状态码为200,表示成功
if (response.getStatusLine().getStatusCode()==200) {
result = EntityUtils.toString(response.getEntity(),HTTP.UTF_8);
CookieStore mCookieStore = httpClient.getCookieStore();
//取得cookiestore
List list = mCookieStore.getCookies();
for (int i = 0; i < list.size(); i++) {
//取得cookie的JSPSESSID的值存在静态变量中,保证每次都是同一个值
if ("JSPSESSID".equals(list.get(i).getName())) {
JSPSESSID = list.get(i).getValue();
}
}
return result;
}
} catch (ClientProtocolException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();}
return null;
}
}
public static String PATH = "http://服务器的IP地址";
public static String JSPSESSID = null;//静态变量用来保存jspsessId的值
/*
* 通过url发送post请求,第一次请求后保存sessionID
*/
public static String queryStringForPost(String url){
HttpPost httpPost = new HttpPost(url);
//实例化HttpPost对象
String result = null;
if (null!=JSPSESSID) {
//判断sessionid是否为空,不为空就将jspsessionid的值放到cookie中发送给服务器httpPost.setHeader("Cookie","JSPSESSID="+JSPSESSID);
}
//实例化连接
DefaultHttpClient httpClient = new DefaultHttpClient();
try {
//实例化返回结果
HttpResponse response = httpClient.execute(httpPost);
//返回状态码为200,表示成功
if (response.getStatusLine().getStatusCode()==200) {
result = EntityUtils.toString(response.getEntity(),HTTP.UTF_8);
CookieStore mCookieStore = httpClient.getCookieStore();
//取得cookiestore
List list = mCookieStore.getCookies();
for (int i = 0; i < list.size(); i++) {
//取得cookie的JSPSESSID的值存在静态变量中,保证每次都是同一个值
if ("JSPSESSID".equals(list.get(i).getName())) {
JSPSESSID = list.get(i).getValue();
}
}
return result;
}
} catch (ClientProtocolException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
return null;
}
不过现在的网络http请求一般都会使用开源框架,文章开头介绍的框架是现在比较流行的,大家可以使用,并且最好是能够解刨里面的实现原理,这对提高自己的能力有显著的提升。
本人第一次写技术文章,写得不好的地方希望各个大神指出来,我会改进的。顺便开通了公众号,以后的文章也会更新到公众号,还有一些生活和面试之类的分享哦。