在进行安卓移动app开发的过程中,由于要使用api接口,本来百度了HttpUrlConnection类可以用来进行Http请求,后来又发现本身使用的AndBase框架自身就封装了Http请求的方法。下面就从2方面介绍下AndBase中的Http请求方法:Http Get请求和Http Post请求。
1. Http Get
一般网络请求,如果不涉及安全性问题,可以采用Get方式完成请求。AndBase中的实现方式是调用AbHttpUtils.get()函数,更进一步,这个函数是调用了AbHttpClient类中的get()函数。以下是源码:
/**
* 描述:带参数的get请求.
*
* @param url the url
* @param params the params
* @param responseListener the response listener
*/
public void get(final String url,final AbRequestParams params,final AbHttpResponseListener responseListener) {
responseListener.setHandler(new ResponderHandler(responseListener));
responseListener.onStart();
mExecutorService.execute(new Runnable() {
public void run() {
try {
doGet(url,params,responseListener);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
如果要使用无参的Get请求,则将第2个参数设置为null即可。过程大致就是Handler发送Message,同时开启线程池,提交当前请求,最后执行doGet()方法。
以下是doGet()的源码:
/**
* 描述:执行get请求.
*
* @param url the url
* @param params the params
* @param responseListener the response listener
*/
private void doGet(String url,AbRequestParams params,AbHttpResponseListener responseListener){
try {
if(!AbAppUtil.isNetworkAvailable(mContext)){
Thread.sleep(200);
responseListener.sendFailureMessage(AbHttpStatus.CONNECT_FAILURE_CODE,AbAppConfig.CONNECT_EXCEPTION, new AbAppException(AbAppConfig.CONNECT_EXCEPTION));
return;
}
//HttpGet连接对象
if(params!=null){
if(url.indexOf("?")==-1){
url += "?";
}
url += params.getParamString();
}
HttpGet httpGet = new HttpGet(url);
httpGet.addHeader(USER_AGENT, userAgent);
//压缩
httpGet.addHeader(ACCEPT_ENCODING, "gzip");
//取得默认的HttpClient
HttpClient httpClient = getHttpClient();
//取得HttpResponse
httpClient.execute(httpGet,new RedirectionResponseHandler(url,responseListener),mHttpContext);
} catch (Exception e) {
e.printStackTrace();
//发送失败消息
responseListener.sendFailureMessage(AbHttpStatus.UNTREATED_CODE,e.getMessage(),new AbAppException(e));
}
}
首先判断网络是否可用,其次将参数拼接到url中,获得HttpGet连接对象,然后设置一些属性,如用户代理、压缩格式,最后取得HttpResponse对象,在ResponseHandler接口处理响应。
2. Http Post
如果需要传递相关参数,可以使用Post请求。源码如下:
/**
* 描述:带参数的post请求.
*
* @param url the url
* @param params the params
* @param responseListener the response listener
*/
public void post(final String url,final AbRequestParams params,
final AbHttpResponseListener responseListener) {
responseListener.setHandler(new ResponderHandler(responseListener));
responseListener.onStart();
mExecutorService.execute(new Runnable() {
public void run() {
try {
doPost(url,params,responseListener);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
内容与get()相似,这里就不再赘述了。原理也是调用了doPost()函数,代码如下:
/**
* 描述:执行post请求.
*
* @param url the url
* @param params the params
* @param responseListener the response listener
*/
private void doPost(String url,AbRequestParams params,AbHttpResponseListener responseListener){
try {
if(!AbAppUtil.isNetworkAvailable(mContext)){
Thread.sleep(200);
responseListener.sendFailureMessage(AbHttpStatus.CONNECT_FAILURE_CODE,AbAppConfig.CONNECT_EXCEPTION, new AbAppException(AbAppConfig.CONNECT_EXCEPTION));
return;
}
//HttpPost连接对象
HttpPost httpPost = new HttpPost(url);
httpPost.addHeader(USER_AGENT, userAgent);
//压缩
httpPost.addHeader(ACCEPT_ENCODING, "gzip");
//是否包含文件
boolean isContainFile = false;
if(params != null){
//使用NameValuePair来保存要传递的Post参数设置字符集
HttpEntity httpentity = params.getEntity();
//请求httpRequest
httpPost.setEntity(httpentity);
if(params.getFileParams().size()>0){
isContainFile = true;
}
}
//取得默认的HttpClient
DefaultHttpClient httpClient = getHttpClient();
if(isContainFile){
httpPost.addHeader("connection", "keep-alive");
httpPost.addHeader("Content-Type", "multipart/form-data; boundary=" + params.boundaryString());
AbLogUtil.i(mContext, "[HTTP POST]:"+url+",包含文件域!");
}
//取得HttpResponse
httpClient.execute(httpPost,new RedirectionResponseHandler(url,responseListener),mHttpContext);
} catch (Exception e) {
e.printStackTrace();
AbLogUtil.i(mContext, "[HTTP POST]:"+url+",error:"+e.getMessage());
//发送失败消息
responseListener.sendFailureMessage(AbHttpStatus.UNTREATED_CODE,e.getMessage(),new AbAppException(e));
}
}
中间需要判断是否包含文件,如果有,则设置httpPost对象的一些属性,如:长连接、内容类型等。以下是一个向jsp传递参数完成数据验证的例子:
public void PostClick(View v){
url="http://192.168.199.172:8080/JSP/post.jsp";
params=new AbRequestParams();
params.put("name", "darker");
params.put("password", "49681888");
httpUtil.post(url, params, new PostResponseListener(this));
}
jsp中则用getParameter()获取参数。
<% String name=request.getParameter("name"); String password=request.getParameter("password");
%>