1.概述
Android中提供了两种执行网络请求的方式,一种是使用Apache的HttpClient,另一种则是java的HttpURLConnection。
2.HttpClient
HttpClient是一个完善的客户端,提供了对HTTP协议的全面支持,可以使用HttpClient的对象来执行HTTP GET和HTTP POST调用。由于在android6.0中,HttpClient库已经被移除,因此,在本文中简单介绍下HttpClient,不作细研究,重点介绍HttpURLConnection。HttpClient的一般使用步骤如下:
//(1)使用DefaultHttpClient类实例化HttpClient对象,设置默认的请求参数;
HttpClient httpclient = new DefaultHttpClient(defaultHttpParams());
//(2)创建HttpGet或HttpPost对象,将要请求的URL通过构造方法传入HttpGet或HttpPost对象;
HttpGet httpget = new HttpGet(url);
//添加header
httpget.addHeader("connection","Keep-Alive");
//(3)调用execute方法发送HTTP GET或HTTP POST请求,并返回HttpResponse对象;
HttpResponse response = new httpclient.execute(httpget);
//(4)通过HttpResponse接口的getEntity方法返回响应信息,并进行相应处理
HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream instream = entity.getContent();
//解析处理结果,将请求结果转化为String类型
String result = convertStreamToString(instream);
instream.close();
}
HTTP GET 调用的一个缺点就是,请求的参数作为URL一部分来传递,这样使得请求参数等信息都会直接暴露在URL中。
POST请求参数通过键值对的形式存储在List中,然后将所有参数打包到UrlEncodedFromEntity实体对象中,最后通过HttpClient进行发送。
3.HttpURLConnection
HttpURLConnection是最佳的选择,因为它的APU简单,体积较小,因而非常适用于Android项目。HttpURLConnection的压缩和缓存机制可以有效地减少网络访问的流量,在提升速度和省电方面也起到了较大作用,在Android6.0之后成为我们进行网络请求的唯一选择。
使用HttpURLConnection的示例代码如下:
private void sendRequest(String url) throws IOException {
InputStream is = null;
try {
URL newUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection)newUrl.openConnection();
//设置读超时为10s
conn.setReadTimeout(10*1000);
//设置链接超时为15s
conn.setConnectTimeout(15*1000);
// 设置请求方式,如果是Get请求值为“GET“,Post则为“POST“
conn.setRequestMethod("POST");
//接收输入流
conn.setDoInput(true);
//启动输出流,当需要传递参数时需要开启
conn.setDoOutput(true);
//添加Header
conn.setRequestProperty("Connection","Keep-Alive");
//添加参数,如果是Get请求,参数要写在URL中
List<NameValuePair> paramsList = new ArrayList<NameValuePair>();
paramsList.add(new BasicNameValuePair("username","chunsoft"));
paramsList.add(new BasicNameValuePair("pwd","123456"));
writeParams(conn.getInputstream(),paramList);
//发起请求
conn.connect();
is = conn.getInputStream();
//获取结果
String result = convertStreamToString(is);
}finally {
if(is != null) {
is.close();
}
}
}