java应用集锦9:httpclient4.2.2的几个常用方法,登录之后访问页面问题,下载文件

简介:

在工作中要用到android,然后进行网络请求的时候,打算使用httpClient。

总结一下httpClient的一些基本使用。

版本是4.2.2。

 

使用这个版本的过程中,百度很多,结果都是出现的org.apache.commons.httpclient.这个包名,而不是我这里的org.apache.http.client.HttpClient----------前者版本是 Commons HttpClient 3.x ,不是最新的版本HttpClient 4.×。

 

官网上面:

 

Commons HttpClient 3.x codeline is at the end of life. All users of Commons HttpClient 3.x are strongly encouraged to upgrade to HttpClient 4.1.  

 

 

1.基本的get

 

Java代码   收藏代码
  1. public void getUrl(String url, String encoding)  
  2.             throws ClientProtocolException, IOException {  
  3.         // 默认的client类。  
  4.         HttpClient client = new DefaultHttpClient();  
  5.         // 设置为get取连接的方式.  
  6.         HttpGet get = new HttpGet(url);  
  7.         // 得到返回的response.  
  8.         HttpResponse response = client.execute(get);  
  9.         // 得到返回的client里面的实体对象信息.  
  10.         HttpEntity entity = response.getEntity();  
  11.         if (entity != null) {  
  12.             System.out.println("内容编码是:" + entity.getContentEncoding());  
  13.             System.out.println("内容类型是:" + entity.getContentType());  
  14.             // 得到返回的主体内容.  
  15.             InputStream instream = entity.getContent();  
  16.             try {  
  17.                 BufferedReader reader = new BufferedReader(  
  18.                         new InputStreamReader(instream, encoding));  
  19.                 System.out.println(reader.readLine());  
  20.             } catch (Exception e) {  
  21.                 e.printStackTrace();  
  22.             } finally {  
  23.                 instream.close();  
  24.             }  
  25.         }  
  26.   
  27.         // 关闭连接.  
  28.         client.getConnectionManager().shutdown();  
  29.     }  

 

2.基本的Post

   下面的params参数,是在表单里面提交的参数。

 

Java代码   收藏代码
  1. public void postUrlWithParams(String url, Map params, String encoding)  
  2.             throws Exception {  
  3.         DefaultHttpClient httpclient = new DefaultHttpClient();  
  4.         try {  
  5.   
  6.             HttpPost httpost = new HttpPost(url);  
  7.             // 添加参数  
  8.             List<NameValuePair> nvps = new ArrayList<NameValuePair>();  
  9.             if (params != null && params.keySet().size() > 0) {  
  10.                 Iterator iterator = params.entrySet().iterator();  
  11.                 while (iterator.hasNext()) {  
  12.                     Map.Entry entry = (Entry) iterator.next();  
  13.                     nvps.add(new BasicNameValuePair((String) entry.getKey(),  
  14.                             (String) entry.getValue()));  
  15.                 }  
  16.             }  
  17.   
  18.             httpost.setEntity(new UrlEncodedFormEntity(nvps, Consts.UTF_8));  
  19.   
  20.             HttpResponse response = httpclient.execute(httpost);  
  21.             HttpEntity entity = response.getEntity();  
  22.   
  23.             System.out.println("Login form get: " + response.getStatusLine()  
  24.                     + entity.getContent());  
  25.             dump(entity, encoding);  
  26.             System.out.println("Post logon cookies:");  
  27.             List<Cookie> cookies = httpclient.getCookieStore().getCookies();  
  28.             if (cookies.isEmpty()) {  
  29.                 System.out.println("None");  
  30.             } else {  
  31.                 for (int i = 0; i < cookies.size(); i++) {  
  32.                     System.out.println("- " + cookies.get(i).toString());  
  33.                 }  
  34.             }  
  35.   
  36.         } finally {  
  37.             // 关闭请求  
  38.             httpclient.getConnectionManager().shutdown();  
  39.         }  
  40.     }  

 

3。打印页面输出的小代码片段

 

Java代码   收藏代码
  1. private static void dump(HttpEntity entity, String encoding)  
  2.             throws IOException {  
  3.         BufferedReader br = new BufferedReader(new InputStreamReader(  
  4.                 entity.getContent(), encoding));  
  5.         System.out.println(br.readLine());  
  6.     }  

 

4.常见的登录session问题,需求:使用账户,密码登录系统之后,然后再访问页面不出错。

 

特别注意,下面的httpclient对象要使用一个,而不要在第二次访问的时候,重新new一个。至于如何保存这个第一步经过了验证的 httpclient,有很多种方法实现。单例,系统全局变量(android 下面的Application),ThreadLocal变量等等。

 

       以及下面创建的httpClient要使用ThreadSafeClientConnManager对象!

 

   public String getSessionId(String url, Map params, String encoding,

Java代码   收藏代码
  1.         String url2) throws Exception {  
  2.     DefaultHttpClient httpclient = new DefaultHttpClient(  
  3.             new ThreadSafeClientConnManager());  
  4.     try {  
  5.   
  6.         HttpPost httpost = new HttpPost(url);  
  7.         // 添加参数  
  8.         List<NameValuePair> nvps = new ArrayList<NameValuePair>();  
  9.         if (params != null && params.keySet().size() > 0) {  
  10.             Iterator iterator = params.entrySet().iterator();  
  11.             while (iterator.hasNext()) {  
  12.                 Map.Entry entry = (Entry) iterator.next();  
  13.                 nvps.add(new BasicNameValuePair((String) entry.getKey(),  
  14.                         (String) entry.getValue()));  
  15.             }  
  16.         }  
  17.         // 设置请求的编码格式  
  18.         httpost.setEntity(new UrlEncodedFormEntity(nvps, Consts.UTF_8));  
  19.         // 登录一遍  
  20.         httpclient.execute(httpost);  
  21.         // 然后再第二次请求普通的url即可。  
  22.         httpost = new HttpPost(url2);  
  23.         BasicResponseHandler responseHandler = new BasicResponseHandler();  
  24.         System.out.println(httpclient.execute(httpost, responseHandler));  
  25.     } finally {  
  26.         // 关闭请求  
  27.         httpclient.getConnectionManager().shutdown();  
  28.     }  
  29.     return "";  
  30. }  

 

5.下载文件,例如mp3等等。

 

Java代码   收藏代码
  1. //第一个参数,网络连接;第二个参数,保存到本地文件的地址  
  2. public void getFile(String url, String fileName) {  
  3.         HttpClient httpClient = new DefaultHttpClient();  
  4.         HttpGet get = new HttpGet(url);  
  5.         try {  
  6.             ResponseHandler<byte[]> handler = new ResponseHandler<byte[]>() {  
  7.                 public byte[] handleResponse(HttpResponse response)  
  8.                         throws ClientProtocolException, IOException {  
  9.                     HttpEntity entity = response.getEntity();  
  10.                     if (entity != null) {  
  11.                         return EntityUtils.toByteArray(entity);  
  12.                     } else {  
  13.                         return null;  
  14.                     }  
  15.                 }  
  16.             };  
  17.   
  18.             byte[] charts = httpClient.execute(get, handler);  
  19.             FileOutputStream out = new FileOutputStream(fileName);  
  20.             out.write(charts);  
  21.             out.close();  
  22.   
  23.         } catch (Exception e) {  
  24.             e.printStackTrace();  
  25.         } finally {  
  26.             httpClient.getConnectionManager().shutdown();  
  27.         }  
  28.     }  

 

6.创建一个多线程环境下面可用的httpClient

(原文:http://blog.csdn.net/jiaoshi0531/article/details/6459468

 

Java代码   收藏代码
  1.               HttpParams params = new BasicHttpParams();  
  2. //设置允许链接的做多链接数目  
  3. ConnManagerParams.setMaxTotalConnections(params, 200);  
  4. //设置超时时间.  
  5. ConnManagerParams.setTimeout(params, 10000);  
  6. //设置每个路由的最多链接数量是20  
  7. ConnPerRouteBean connPerRoute = new ConnPerRouteBean(20);  
  8. //设置到指定主机的路由的最多数量是50  
  9. HttpHost localhost = new HttpHost("127.0.0.1",80);  
  10. connPerRoute.setMaxForRoute(new HttpRoute(localhost), 50);  
  11. ConnManagerParams.setMaxConnectionsPerRoute(params, connPerRoute);  
  12. //设置链接使用的版本  
  13. HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);  
  14. //设置链接使用的内容的编码  
  15. HttpProtocolParams.setContentCharset(params,  
  16.         HTTP.DEFAULT_CONTENT_CHARSET);  
  17. //是否希望可以继续使用.  
  18. HttpProtocolParams.setUseExpectContinue(params, true);  
  19.   
  20. SchemeRegistry schemeRegistry = new SchemeRegistry();  
  21. schemeRegistry.register(new Scheme("http",PlainSocketFactory.getSocketFactory(),80));  
  22. schemeRegistry.register(new Scheme("https",SSLSocketFactory.getSocketFactory(),443));  
  23. ClientConnectionManager cm = new ThreadSafeClientConnManager(params,schemeRegistry);  
  24. httpClient = new DefaultHttpClient(cm, params);   

 

7.实用的一个对象,http上下文,可以从这个对象里面取到一次请求相关的信息,例如request,response,代理主机等。

 

Java代码   收藏代码
  1. public static void getUrl(String url, String encoding)  
  2.             throws ClientProtocolException, IOException {  
  3.         // 设置为get取连接的方式.  
  4.         HttpGet get = new HttpGet(url);  
  5.         HttpContext localContext = new BasicHttpContext();  
  6.         // 得到返回的response.第二个参数,是上下文,很好的一个参数!  
  7.         httpclient.execute(get, localContext);  
  8.   
  9.         // 从上下文中得到HttpConnection对象  
  10.         HttpConnection con = (HttpConnection) localContext  
  11.                 .getAttribute(ExecutionContext.HTTP_CONNECTION);  
  12.         System.out.println("socket超时时间:" + con.getSocketTimeout());  
  13.   
  14.         // 从上下文中得到HttpHost对象  
  15.         HttpHost target = (HttpHost) localContext  
  16.                 .getAttribute(ExecutionContext.HTTP_TARGET_HOST);  
  17.         System.out.println("最终请求的目标:" + target.getHostName() + ":"  
  18.                 + target.getPort());  
  19.   
  20.         // 从上下文中得到代理相关信息.  
  21.         HttpHost proxy = (HttpHost) localContext  
  22.                 .getAttribute(ExecutionContext.HTTP_PROXY_HOST);  
  23.         if (proxy != null)  
  24.             System.out.println("代理主机的目标:" + proxy.getHostName() + ":"  
  25.                     + proxy.getPort());  
  26.   
  27.         System.out.println("是否发送完毕:"  
  28.                 + localContext.getAttribute(ExecutionContext.HTTP_REQ_SENT));  
  29.   
  30.         // 从上下文中得到HttpRequest对象  
  31.         HttpRequest request = (HttpRequest) localContext  
  32.                 .getAttribute(ExecutionContext.HTTP_REQUEST);  
  33.         System.out.println("请求的版本:" + request.getProtocolVersion());  
  34.         Header[] headers = request.getAllHeaders();  
  35.         System.out.println("请求的头信息: ");  
  36.         for (Header h : headers) {  
  37.             System.out.println(h.getName() + "--" + h.getValue());  
  38.         }  
  39.         System.out.println("请求的链接:" + request.getRequestLine().getUri());  
  40.   
  41.         // 从上下文中得到HttpResponse对象  
  42.         HttpResponse response = (HttpResponse) localContext  
  43.                 .getAttribute(ExecutionContext.HTTP_RESPONSE);  
  44.         HttpEntity entity = response.getEntity();  
  45.         if (entity != null) {  
  46.             System.out.println("返回结果内容编码是:" + entity.getContentEncoding());  
  47.             System.out.println("返回结果内容类型是:" + entity.getContentType());  
  48.             dump(entity, encoding);  
  49.         }  
  50.     }  

 输出结果大致如下:

 

Txt代码   收藏代码
  1. socket超时时间:0  
  2. 最终请求的目标:money.finance.sina.com.cn:-1  
  3. 是否发送完毕:true  
  4. 请求的版本:HTTP/1.1  
  5. 请求的头信息:   
  6. Host--money.finance.sina.com.cn  
  7. Connection--Keep-Alive  
  8. User-Agent--Apache-HttpClient/4.2.2 (java 1.5)  
  9. 请求的链接:/corp/go.php/vFD_BalanceSheet/stockid/600031/ctrl/part/displaytype/4.phtml  
  10. 返回结果内容编码是:null  
  11. 返回结果内容类型是:Content-Type: text/html  

 

8.设置代理

 

Java代码   收藏代码
  1.              //String  hostIp代理主机ip,int port  代理端口  
  2. tpHost proxy = new HttpHost(hostIp, port);  
  3. // 设置代理主机.  
  4. tpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY,  
  5. proxy);  

 

9.设置保持链接时间

 

Java代码   收藏代码
  1. //在服务端设置一个保持持久连接的特性.  
  2.         //HTTP服务器配置了会取消在一定时间内没有活动的链接,以节省系统的持久性链接资源.  
  3.         httpClient.setKeepAliveStrategy(new ConnectionKeepAliveStrategy() {  
  4.             public long getKeepAliveDuration(HttpResponse response,  
  5.                     HttpContext context) {  
  6.                 HeaderElementIterator it = new BasicHeaderElementIterator(  
  7.                         response.headerIterator(HTTP.CONN_KEEP_ALIVE));  
  8.                 while (it.hasNext()) {  
  9.                     HeaderElement he = it.nextElement();  
  10.                     String param = he.getName();  
  11.                     String value = he.getValue();  
  12.                     if (value != null && param.equalsIgnoreCase("timeout")) {  
  13.                         try {  
  14.                             return Long.parseLong(value) * 1000;  
  15.                         } catch (Exception e) {  
  16.   
  17.                         }  
  18.                     }  
  19.                 }  
  20.                 HttpHost target = (HttpHost)context.getAttribute(ExecutionContext.HTTP_TARGET_HOST);  
  21.                 if("www.baidu.com".equalsIgnoreCase(target.getHostName())){  
  22.                     return 5*1000;  
  23.                 }  
  24.                 else  
  25.                     return 30*1000;   
  26.             }   
  27.         });  

 


本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/5446871.html,如需转载请自行联系原作者

相关文章
|
1月前
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
1月前
|
存储 算法 安全
Java对象创建和访问
Java对象创建过程包括类加载检查、内存分配(指针碰撞或空闲列表)、内存初始化、对象头设置及初始化方法执行。访问方式有句柄和直接指针两种,前者稳定但需额外定位,后者速度快。对象创建涉及并发安全、垃圾回收等机制。
Java对象创建和访问
|
2月前
|
存储 缓存 Java
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
242 3
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
|
2月前
|
存储 算法 Java
解锁“分享文件”高效密码:探秘 Java 二叉搜索树算法
在信息爆炸的时代,文件分享至关重要。二叉搜索树(BST)以其高效的查找性能,为文件分享优化提供了新路径。本文聚焦Java环境下BST的应用,介绍其基础结构、实现示例及进阶优化。BST通过有序节点快速定位文件,结合自平衡树、多线程和权限管理,大幅提升文件分享效率与安全性。代码示例展示了文件插入与查找的基本操作,适用于大规模并发场景,确保分享过程流畅高效。掌握BST算法,助力文件分享创新发展。
|
2月前
|
Java API 数据处理
深潜数据海洋:Java文件读写全面解析与实战指南
通过本文的详细解析与实战示例,您可以系统地掌握Java中各种文件读写操作,从基本的读写到高效的NIO操作,再到文件复制、移动和删除。希望这些内容能够帮助您在实际项目中处理文件数据,提高开发效率和代码质量。
60 4
|
2月前
|
存储 小程序 前端开发
微信小程序与Java后端实现微信授权登录功能
微信小程序极大地简化了登录注册流程。对于用户而言,仅仅需要点击授权按钮,便能够完成登录操作,无需经历繁琐的注册步骤以及输入账号密码等一系列复杂操作,这种便捷的登录方式极大地提升了用户的使用体验
642 12
|
2月前
|
缓存 Java 应用服务中间件
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
386 5
|
3月前
|
NoSQL JavaScript 前端开发
Java访问MongoDB
Java访问MongoDB
51 21
|
3月前
|
SQL Java 数据库连接
【潜意识Java】深入理解MyBatis的Mapper层,以及让数据访问更高效的详细分析
深入理解MyBatis的Mapper层,以及让数据访问更高效的详细分析
195 1