在最近做一些东西需要利用到网络开发这一块,Android SDK集成的Apache HttpClient模块。要注意的是,这里的Apache HttpClient模块是HttpClient 4.0(org.apache.http.*),而不是Jakarta Commons HttpClient 3.x(org.apache.commons.httpclient.*)。主要是两种请求方式的使用:
先说一下HttpGet和HttpPost的一些区别:
1、Httpget方式在安全性上,Get的安全性要稍微差点,因为它会把信息直接在地址栏显示出来,httppost是设置在setentity方法中。
2、Httpget的URL长度不能超过2048,不难或出现异常。httppost就没有此限制。
下面是Http使用的一些步骤:
1.创建HttpGet或HttpPost对象,将要请求的URL通过构造方法传入HttpGet或HttpPost对象。
2.使用DefaultHttpClient类的execute方法发送HTTP GET或HTTP POST请求,并返回HttpResponse对象。
3.通过HttpResponse接口的getEntity方法返回响应信息,并进行相应的处理。
2.使用DefaultHttpClient类的execute方法发送HTTP GET或HTTP POST请求,并返回HttpResponse对象。
3.通过HttpResponse接口的getEntity方法返回响应信息,并进行相应的处理。
以下是我的一个实例:
public class HttpUtils {
private final static String TAG = HttpUtils.class.getSimpleName();
private BasicHttpParams httpParams;
private HttpClient httpClient;
/**
* 获取HttpClient对象(设置一些参数)
* @return
*/
public HttpClient getHttpClient() {
// 创建 HttpParams 以用来设置 HTTP 参数(这一部分不是必需的)
this.httpParams = new BasicHttpParams();
// 设置连接超时和 Socket 超时,以及 Socket 缓存大小
HttpConnectionParams.setConnectionTimeout(httpParams, 20 * 1000);
HttpConnectionParams.setSoTimeout(httpParams, 20 * 1000);
HttpConnectionParams.setSocketBufferSize(httpParams, 8192);
// 设置重定向,缺省为 true
HttpClientParams.setRedirecting(httpParams, true);
// 设置 user agent
String userAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2) Gecko/20100115 Firefox/3.6";
HttpProtocolParams.setUserAgent(httpParams, userAgent);
// 创建一个 HttpClient 实例
// 注意 HttpClient httpClient = new HttpClient(); 是Commons HttpClient
// 中的用法,在 Android 1.5 中我们需要使用 Apache 的缺省实现 DefaultHttpClient
httpClient = new DefaultHttpClient(httpParams);
return httpClient;
}
//使用HTTP GET调用有一个缺点就是,请求的参数作为URL一部分来传递,
//以这种方式传递的时候,URL的长度应该在2048个字符之内。
//如果超出这个这范围,就要使用到HTTP POST调用。
/**
* @param params
*/
public static String HttpRequstDataByGet(String url, Map params) {
String paramStr = "";
Iterator iter = params.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
Object key = entry.getKey();
Object val = entry.getValue();
paramStr += paramStr = "&" + key + "=" + val;
}
if (!paramStr.equals("")) {
paramStr = paramStr.replaceFirst("&", "?");
url += paramStr;
}
return HttpRequstDataByGet(url);
}
/**
* 利用get方式请求数据
* @param uri
*/
public static String HttpRequstDataByGet(String uri) {
String resultStr = null;
BufferedReader in = null;
try {
//得到HttpClient对象
HttpClient getClient = new DefaultHttpClient();
//得到HttpGet对象
HttpGet request = new HttpGet(uri);
//客户端使用GET方式执行请教,获得服务器端的回应response
HttpResponse response = getClient.execute(request);
//判断请求是否成功
if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){
Log.i(TAG, "请求服务器端成功");
//获得输入流
InputStream inStrem = response.getEntity().getContent();
in = new BufferedReader(new InputStreamReader(inStrem));
String lineStr;
StringBuffer string = new StringBuffer("");
while ((lineStr = in.readLine()) != null){
string.append(lineStr);
}
//关闭输入流
inStrem.close();
//另外一种方法strResult = EntityUtils.toString(httpResponse.getEntity());
}else {
Log.i(TAG, "请求服务器端失败");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return resultStr;
}
public static String HttpRequstDataByPost(String url, Map params) {
List<NameValuePair> postParameters = new ArrayList<NameValuePair>();
Iterator iter = params.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
Object key = entry.getKey();
Object val = entry.getValue();
//添加要传递的参数
postParameters.add(new BasicNameValuePair(key.toString(), val.toString()));
}
return HttpRequstDataByPost(url, postParameters);
}
/**
* @param url
* @return
*/
public static String HttpRequstDataByPost(String url, List<NameValuePair> params) {
String resultStr = null;
BufferedReader in = null;
try {
HttpClient client = new DefaultHttpClient();
HttpPost request = new HttpPost(url);
//实例化UrlEncodedFormEntity对象
UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(
params);
//使用HttpPost对象来设置UrlEncodedFormEntity的Entity
request.setEntity(formEntity);
HttpResponse response = client.execute(request);
if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){
in = new BufferedReader(
new InputStreamReader(
response.getEntity().getContent()));
StringBuffer string = new StringBuffer("");
String lineStr = "";
while ((lineStr = in.readLine()) != null) {
string.append(lineStr + "\n");
}
in.close();
//另外一种方法resultStr = EntityUtils.toString(httpResponse.getEntity());
resultStr = string.toString();
System.out.println(resultStr);
}else {
Log.i(TAG, "请求服务器端失败");
}
} catch(Exception e) {
// Do something about exceptions
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return resultStr;
}
httpget 和httpPost在相互转换使用的:
Httpget的Url的参数设置(直接拼接):
String YouDaoUrl = YouDaoBaseUrl + "?keyfrom=" + YouDaoKeyFrom
+ "&key=" + YouDaoKey + "&type=" + YouDaoType + "&doctype="
+ YouDaoDoctype + "&type=" + YouDaoType + "&version="
+ YouDaoVersion + "&q=" + keyWord;
HttpPost的参数设置:
//封装传递参数的集合
List<NameValuePair> parameters = new ArrayList<NameValuePair>();
//往这个集合中添加你要传递的参数
parameters.add(new BasicNameValuePair("keyfrom", YouDaoKeyFrom));
parameters.add(new BasicNameValuePair("key", YouDaoKey));
parameters.add(new BasicNameValuePair("type", YouDaoType));
parameters.add(new BasicNameValuePair("doctype", YouDaoDoctype));
parameters.add(new BasicNameValuePair("version", YouDaoVersion));
parameters.add(new BasicNameValuePair("q", keword));
//创建传递参数封装 实体对象
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(parameters);//设置传递参数的编码
//把实体对象存入到httpPost对象中
httpPost.setEntity(entity);
以上是个人对HttpClient的总结,希望对大家有用