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");%>
阅读全文
0 0
- Andbase中的Http请求
- HTTP请求中的请求字段
- python中的http请求
- Swift中的HTTP请求
- nodejs中的HTTP请求
- http请求中的referer
- Android中的HTTP请求
- Swift中的HTTP请求
- Android中的Http请求
- Node中的HTTP请求
- http 请求中的 referer
- http请求中的header
- http 请求中的 referer
- http 请求中的 referer
- http请求中的方法
- HTTP中的GET请求与POST请求
- haproxy 中的http请求和https请求
- HTTP中的get请求与post请求
- Java几个简单的面试题1
- List isEmpty()和size()==0 有什么区别
- Swift 系统Modal转场样式
- CRAFT Objects from Images
- ueditor jsp版本 后台配置项无法加载解决方案--局域网内项目
- Andbase中的Http请求
- 个人存档
- Spring 事务属性的种类
- mongodb设置密码
- php+vue.js 实现省市县乡的四级联动(ajax加载)
- Maven库
- 手把手教您在SuperMap iDesktop中制作全球晕渲图
- 在servlet(或者filter或者listener)中使用spring的IOC容器
- Elasticsearch 中文分词器 IK 配置和使用