Android开发随想

本文介绍了如何使用Apache的common-httpclient.jar库实现自定义网络请求框架,包括GET和POST请求的具体实现方法,并提供了流转换技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       今年是我工作的第二个年头,从一个只懂基本语言到现在的项目负责人,一路走来感触很多,从最初的Struts1.x到现在的SpringMvc,自己也学习到不少的东西,从只懂java到现在开发Android,我想从现在开始每周写一稿博客来分享现在的点点经验。
      
       废话不说,直接开始!
       很多开发者都对网络请求有一些了解,但是对网络请求的封装又有哪些了解呢?是不是可以直接在网络请求返回中构建一个集合对象出来呢?是不是直接可以在网络请求中更新UI界面呢?我们就这些问题一步步的完善我们的自定义网络请求框架!

      
       在学习的过程中,我使用的是一个Apache不再维护的库 common-httpclient.jar 有兴趣可以去找找。它中间有两个核心的方法,一个GetMethod,一个PostMethod见名知意,一个做get请求用的,一个做post请求用的,get请求和post请求的不同之一是有个数据量的限制,get限制在2kb的大小 ,post没有大小限制,了解J2EE开发的同学知道get请求参数会在url的后面,类似:http://www.xxx.yyy?name=zzz&pass=kkk....这样的,很明显,在一定程度上不安全!post不会这样的,会带在请求正文中的。


/**  
 * 申明一个网络访问的客户端
 */
static HttpClient mHttpClient;

/**
 * GET方式
 * @param url     服务器地址    例:http://192.168.17.12:8080/Conn/test?name=xxx&pass=yyy;
 * @return        JSON数据
 */ 
public static String get(String url){
   String response = null;
   if(null != url && !"".equals(url)){
      mHttpClient = new HttpClient();
      mHttpClient.getHttpConnectionManager().getParams().setConnectionTimeout(5000);
      mHttpClient.getParams().setUriCharset("UTF-8");
      GetMethod method = new GetMethod(url);
      try {
         int status = mHttpClient.executeMethod(method);
         if(status==HttpStatus.SC_OK){
             //注意,这个位置中可以返回一个getResponseAsString()的方法,但是不要用!!!为什么?
             response = convertResponse(method.getResponseBodyAsStream());         
          }
      } catch (IOException e) {
         e.printStackTrace();
         mHttpClient = null;
         method = null;
         return response;
      }
      mHttpClient = null;
      method = null;
   }
   return response;
}

上面这个方法是get方法去请求服务器,因为你不知道这个请求返回了多少的数据量,所以不要使用getResponseAsString()的方法去做!用一个String 接收会有内存问题出现!慎重慎重!

     接下来我做的一个post请求:
/**
 * POST方式
 * @param url  服务器地址
 * @param params 参数列表
 * @return JSON数据
 */ 
public static String post(String url , Map<String,Object> params){
   String response = null;
   url = getAbsoluteUrl(url);
   if(null != url && !"".equals(url)){
      List<NameValuePair> valuePairs = new ArrayList<NameValuePair>();
      NameValuePair valuePair;
      if(null!=params&&!params.isEmpty()){
         Iterator<String> keys = params.keySet().iterator();
         while(keys.hasNext()){
            String key = keys.next();
            //TODO  要改进的地方
            String value = (String)params.get(key);
            valuePair = new NameValuePair(key, value);
            valuePairs.add(valuePair);
         }
      }
      
      NameValuePair[] values = {};
      values = valuePairs.toArray(values);
      
      mHttpClient = new HttpClient();
      mHttpClient.getHttpConnectionManager().getParams().setConnectionTimeout(5000);
      mHttpClient.getParams().setUriCharset("UTF-8");
      
      PostMethod method = new PostMethod(url);
      method.addParameters(values);
      
      try {
         int status = mHttpClient.executeMethod(method);
         if(status==HttpStatus.SC_OK){
            response = convertResponse(method.getResponseBodyAsStream());
         }if(status==HttpStatus.SC_FORBIDDEN){
            String cookie = mHttpClient.getParams().getCookiePolicy();
            System.out.println(cookie);
         }
      } catch (IOException e) {
         e.printStackTrace();
         mHttpClient = null;
         method = null;
         return response;
      }
      mHttpClient = null;
      method = null;
   }
   return response;
}

两个请求方式出来了,那么我们来做最后的流的转换,这样可以省去一些不必要的麻烦!

/**
 * 输入流转换成String
 * @param inputStream 输入流
 * @return
 * @throws java.io.IOException
 */
private static String convertResponse(InputStream inputStream) throws IOException{
   int len = 0;
   byte[] buffer = new byte[1024];
   StringBuffer sb = new StringBuffer();
   while((len=inputStream.read(buffer))!=-1){
      sb.append(new String(buffer,0,len));
   }
   return sb.toString();
}

这样带有缓冲区的String容器是你不二选择!
这样的方法已经可以满足一些人的需要了,今天先到这,我去吃饭了~,下篇博客我会加入文件上传,以及我对全局URL的封装!也会讲解为什么会这样做!先卖个关子


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值