今年是我工作的第二个年头,从一个只懂基本语言到现在的项目负责人,一路走来感触很多,从最初的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不会这样的,会带在请求正文中的。
上面这个方法是get方法去请求服务器,因为你不知道这个请求返回了多少的数据量,所以不要使用getResponseAsString()的方法去做!用一个String 接收会有内存问题出现!慎重慎重!
接下来我做的一个post请求:
两个请求方式出来了,那么我们来做最后的流的转换,这样可以省去一些不必要的麻烦!
这样带有缓冲区的String容器是你不二选择!
这样的方法已经可以满足一些人的需要了,今天先到这,我去吃饭了~,下篇博客我会加入文件上传,以及我对全局URL的封装!也会讲解为什么会这样做!先卖个关子
废话不说,直接开始!
很多开发者都对网络请求有一些了解,但是对网络请求的封装又有哪些了解呢?是不是可以直接在网络请求返回中构建一个集合对象出来呢?是不是直接可以在网络请求中更新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的封装!也会讲解为什么会这样做!先卖个关子