Andbase中的Http请求

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








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值