博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HttpURLConnection和HttpClient的使用
阅读量:5906 次
发布时间:2019-06-19

本文共 4265 字,大约阅读时间需要 14 分钟。

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请求一般都会使用开源框架,文章开头介绍的框架是现在比较流行的,大家可以使用,并且最好是能够解刨里面的实现原理,这对提高自己的能力有显著的提升。

本人第一次写技术文章,写得不好的地方希望各个大神指出来,我会改进的。顺便开通了公众号,以后的文章也会更新到公众号,还有一些生活和面试之类的分享哦。

转载地址:http://decpx.baihongyu.com/

你可能感兴趣的文章
元学习法 - XDITE -Xdite 郑伊廷
查看>>
Firewall之iptables篇
查看>>
sed 语法
查看>>
RHEL6入门系列之二十二,quota磁盘配额管理
查看>>
费用登记系统(小结)
查看>>
Windows Group Policy Startup script is not executed at startup
查看>>
智能指针
查看>>
AIX修改用户密码登录不成功案例分享
查看>>
openstack组件使用的默认端口
查看>>
c语言简单版坦克大战(AllenEnemyTrank文件)
查看>>
Java私塾: 研磨设计之备忘录模式(Memento)
查看>>
理解call和apply方法
查看>>
异步加载(延迟加载)与同步加载
查看>>
机器学习瓶颈 - 从黑盒白盒之争说起
查看>>
小程序图片上传七牛
查看>>
java交换两个变量值a,b的多钟方法
查看>>
Python中被双下划线包围的魔法方法
查看>>
JAVA核心编程教学
查看>>
Oracle:数据类型对应表
查看>>
洛谷P1349 广义斐波那契数列
查看>>