Andbase中的Http请求

来源:互联网 发布:怪物猎人2g多玩数据库 编辑:程序博客网 时间:2024/05/22 14:00

在进行安卓移动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");
%>