一、HttpUrlConnection
最开始学android的时候用的网络请求是HttpUrlConnection,当时很多东西还不知道,但是在android 2.2及以下版本中HttpUrlConnection存在着一些bug,所以建议在android 2.3以后使用HttpUrlConnection,之前使用HttpClient。
在Android 2.2版本之前,HttpClient拥有较少的bug,因此使用它是最好的选择。而在Android 2.3版本及以后,HttpURLConnection则是最佳的选择。它的API简单,体积较小,因而非常适用于Android项目。压缩和缓存机制可以有效地减少网络访问的流量,在提升速度和省电方面也起到了较大的作用。对于新的应用程序应该更加偏向于使用HttpURLConnection,因为在以后的工作当中我们也会将更多的时间放在优化HttpURLConnection上面。
特点
- 比较轻便,灵活,易于扩展
- 在3.0后以及4.0中都进行了改善,如对HTTPS的支持
- 在4.0中,还增加了对缓存的支持
用法
- 首先我们需要获取到一个HttpURLConnection实例,一般需要new出一个URL对象,并传入目标网络地址,通过调用openConnection()方法获得HttpURLConnection实例。
- 得到该实例后。我们需要设置一下http请求的的方法,这里我们主要研究get和post,默认是使用get方法。get一般用于从服务器获取数据,post一般用于向服务器提交数据,设置请求方法使用函数setRequestMethod(“POST”)进行设置。
- 此外可以进行一些请求的限制,比如连接超时的时间等,可以通过setConnectTimeout设置超时时间。
- 获取服务器返回的输入流,使用getInputStream方法获取。
- 读取内容并处理
- 关闭连接,通过调用disconnect方法关闭当前的连接。
package com.happy.network;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Iterator;
import java.util.Map;
/**
* HttpUrlConnection
* 在2.2版本之前存在bug,推荐使用httpClient.
* 2.2版本之后,推荐使用httpUrlConnection.
* 优点:
* 体积小 api简单 方便 灵活 扩展性高
* 3.0及4.0进行了改善,增加了对Htpps的支持
* 4.0中还增加了缓存的支持
* Created by me on 2015/10/27.
*/
public class HttpUrlConnectionDemo {
/**
* get请求
*
* @param urlPath
* @return
*/
private String get(String urlPath) {
HttpURLConnection conn = null;
InputStream is = null;
BufferedReader br = null;
try {
URL url = new URL(urlPath);
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");// 设置请求方式
conn.setReadTimeout(50000); // 设置读取超时时间
conn.setConnectTimeout(50000); //设置连接超时时间
conn.setDoInput(true); // 设置是否从httpurlconnection中读入
conn.setUseCaches(false); // 设置是否使用缓存
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
is = conn.getInputStream();// 获取服务端返回数据
br = new BufferedReader(new InputStreamReader(is));
StringBuffer sb = new StringBuffer();
String line = null;
while ((line = br.readLine()) != null) {
sb.append(line);
}
return sb.toString();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (conn != null) {
conn.disconnect();
conn = null;
}
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
/**
* post请求
*
* @param urlPath
* @param params
* @return
*/
public String post(String urlPath, Map<String, String> params) {
if (params == null || params.isEmpty()) {
return get(urlPath);
}
HttpURLConnection conn = null;
InputStream is = null;
OutputStream os = null;
BufferedReader br = null;
StringBuffer sb = getParamStr(params);
byte[] data = sb.toString().getBytes();
try {
URL url = new URL(urlPath);
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setConnectTimeout(50000);
conn.setReadTimeout(50000);
conn.setUseCaches(false);
conn.setDoInput(true);
conn.setDoOutput(true);// 设置为true才能写入参数
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("Content-Length", String.valueOf(data.length));
os = conn.getOutputStream();
os.write(data);//写入参数
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
is = conn.getInputStream();
br = new BufferedReader(new InputStreamReader(is));
StringBuffer response = new StringBuffer();
String line = null;
while ((line = br.readLine()) != null) {
response.append(line);
}
return response.toString();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (conn != null) {
conn.disconnect();
conn = null;
}
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
/**
* post请求组织参数
*
* @param params
* @return
*/
private StringBuffer getParamStr(Map<String, String> params) {
StringBuffer sb = new StringBuffer();
Iterator<Map.Entry<String, String>> entryIterator = params.entrySet().iterator();
while (entryIterator.hasNext()) {
Map.Entry<String, String> next = entryIterator.next();
sb.append(next.getKey() + "=" + next.getValue());
if (entryIterator.hasNext()) {
sb.append("&");
}
}
return null;
}
}
二、HttpClient
特点
- 高效稳定,但是维护成本高昂,故android 开发团队不愿意在维护该库而是转投更为轻便的HttpUrlConnection
用法
- HttpClient是一个接口,因此无法直接创建它的实例,一般都是创建一个DefaultHttpClient实例
- 如果要发起Get请求,需要创建一个HttpGet对象,并传入请求地址
- 如果要发起Post请求,需要创建一个HttpPost对象。并传入请求地址,通过setEntity函数设置请求参数
- 调用execute方法,传入HttpGet或者HttpPost实例,执行后返回HttpResponse对象,判断响应状态码
- 解析响应结果,通过调用getEntity函数获得一个HttpEntity对象,之后可以通过EntityUtils.toString方法将其转换为字符串
由于在android2.3之后就被HttpUrlConnection取代了,这里也不过多介绍了,不过当初学习它的时候还没接触到其他库,就感觉它好方便,下面简单贴出使用方法
package com.happy.network;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.NameValuePair;
import java.io.IOException;
import java.util.List;
/**
* 稳定性高,但维护成本高,已被android团队使用httpUrlConnection替代
* Created by me on 2015/10/27.
*/
public class HttpClientDemo {
private String get(String url){
HttpClient client=null;
HttpGet request=null;
try {
client=new DefaultHttpClient();
request=new HttpGet(url);
HttpResponse response=client.execute(request);
if(response.getStatusLine().getStatusCode()== HttpStatus.SC_OK){
String result=EntityUtils.toString(response.getEntity(),"UTF-8");
return result;
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
private String post(String url,List<NameValuePair> params){
HttpClient client=null;
HttpPost request=null;
try {
client=new DefaultHttpClient();
request=new HttpPost(url);
request.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
HttpResponse response=client.execute(request);
if(response.getStatusLine().getStatusCode()== HttpStatus.SC_OK){
String result=EntityUtils.toString(response.getEntity(),"UTF-8");
return result;
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
欧克,大体使用方法及对比就这些了,部分文字描述来源于网络。