在工作中要用到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

  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. client.getConnectionManager().shutdown();
  28. }

2.基本的Post

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

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

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

  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,

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

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

  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. byte[] charts = httpClient.execute(get, handler);
  18. FileOutputStream out = new FileOutputStream(fileName);
  19. out.write(charts);
  20. out.close();
  21. } catch (Exception e) {
  22. e.printStackTrace();
  23. } finally {
  24. httpClient.getConnectionManager().shutdown();
  25. }
  26. }

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

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

  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. SchemeRegistry schemeRegistry = new SchemeRegistry();
  20. schemeRegistry.register(new Scheme("http",PlainSocketFactory.getSocketFactory(),80));
  21. schemeRegistry.register(new Scheme("https",SSLSocketFactory.getSocketFactory(),443));
  22. ClientConnectionManager cm = new ThreadSafeClientConnManager(params,schemeRegistry);
  23. httpClient = new DefaultHttpClient(cm, params);

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

  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. // 从上下文中得到HttpConnection对象
  9. HttpConnection con = (HttpConnection) localContext
  10. .getAttribute(ExecutionContext.HTTP_CONNECTION);
  11. System.out.println("socket超时时间:" + con.getSocketTimeout());
  12. // 从上下文中得到HttpHost对象
  13. HttpHost target = (HttpHost) localContext
  14. .getAttribute(ExecutionContext.HTTP_TARGET_HOST);
  15. System.out.println("最终请求的目标:" + target.getHostName() + ":"
  16. + target.getPort());
  17. // 从上下文中得到代理相关信息.
  18. HttpHost proxy = (HttpHost) localContext
  19. .getAttribute(ExecutionContext.HTTP_PROXY_HOST);
  20. if (proxy != null)
  21. System.out.println("代理主机的目标:" + proxy.getHostName() + ":"
  22. + proxy.getPort());
  23. System.out.println("是否发送完毕:"
  24. + localContext.getAttribute(ExecutionContext.HTTP_REQ_SENT));
  25. // 从上下文中得到HttpRequest对象
  26. HttpRequest request = (HttpRequest) localContext
  27. .getAttribute(ExecutionContext.HTTP_REQUEST);
  28. System.out.println("请求的版本:" + request.getProtocolVersion());
  29. Header[] headers = request.getAllHeaders();
  30. System.out.println("请求的头信息: ");
  31. for (Header h : headers) {
  32. System.out.println(h.getName() + "--" + h.getValue());
  33. }
  34. System.out.println("请求的链接:" + request.getRequestLine().getUri());
  35. // 从上下文中得到HttpResponse对象
  36. HttpResponse response = (HttpResponse) localContext
  37. .getAttribute(ExecutionContext.HTTP_RESPONSE);
  38. HttpEntity entity = response.getEntity();
  39. if (entity != null) {
  40. System.out.println("返回结果内容编码是:" + entity.getContentEncoding());
  41. System.out.println("返回结果内容类型是:" + entity.getContentType());
  42. dump(entity, encoding);
  43. }
  44. }

输出结果大致如下:

  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.设置代理

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

9.设置保持链接时间

  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. HttpHost target = (HttpHost)context.getAttribute(ExecutionContext.HTTP_TARGET_HOST);
  20. if("www.baidu.com".equalsIgnoreCase(target.getHostName())){
  21. return 5*1000;
  22. }
  23. else
  24. return 30*1000;
  25. }
  26. });

crawler_java应用集锦9:httpclient4.2.2的几个常用方法,登录之后访问页面问题,下载文件_设置代理的更多相关文章

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

    转账注明出处:http://renjie120.iteye.com/blog/1727933 在工作中要用到android,然后进行网络请求的时候,打算使用httpClient. 总结一下httpCl ...

  2. [功能集锦] 001 - java下载文件

    @RequestMapping("/downloadxls.action") public void downloadxls(HttpServletRequest request, ...

  3. HttpClient学习系列 -- 学习总结

    jar包: HttpClient 4.x版本 简要介绍 HttpComponents 包括 HttpCore包和HttpClient包 HttpClient:Http的执行http请求 Default ...

  4. Jmeter性能常见问题集锦

    1. java.net.BindException: Address already in use: connect 开始以为是单机运行脚本运行不过来,所以另加了一台负载机同时运行脚本 分布式环境部署 ...

  5. Web前端优化最佳实践及工具集锦

    Web前端优化最佳实践及工具集锦 发表于2013-09-23 19:47| 21315次阅读| 来源Googe & Yahoo| 118 条评论| 作者王果 编译 Web优化Google雅虎P ...

  6. httpclient4.3 工具类

    httpclient4.3  java工具类. .. .因项目须要开发了一个工具类.正经常常使用的httpclient 请求操作应该都够用了 工具类下载地址:http://download.csdn. ...

  7. Python:常见错误集锦(持续更新ing)

    初学Python,很容易与各种错误不断的遭遇.通过集锦,可以快速的找到错误的原因和解决方法. 1.IndentationError:expected an indented block 说明此处需要缩 ...

  8. .NET面试问答集锦

    程序员级别鉴定书(.NET面试问答集锦) 提供避免元素命名冲突的方法 DOM适合的使用场景是什么?是否有尺寸限制? DOM是一种与浏览器,平台,语言无关的接口,使你可以访问页面其他的标准组件. DOM ...

  9. iOS 传感器集锦

    https://www.jianshu.com/p/5fc26af852b6 传感器集锦:指纹识别.运动传感器.加速计.环境光感.距离传感器.磁力计.陀螺仪   效果预览.gif 一.指纹识别 应用: ...

随机推荐

  1. Android -- Looper.prepare()和Looper.loop() —深度版

    Android中的Looper类,是用来封装消息循环和消息队列的一个类,用于在android线程中进行消息处理.handler事实上能够看做是一个工具类.用来向消息队列中插入消息的. (1) Loop ...

  2. WPF技术触屏上的应用系列(六): 视觉冲击、超炫系统主界面、系统入口效果实现

    原文:WPF技术触屏上的应用系列(六): 视觉冲击.超炫系统主界面.系统入口效果实现 去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用.客户端是Window7操作系统,54寸大屏电脑电视一体 ...

  3. (转)linux service理解

    能够使用service命令进行操作的,就是已经注册成为linux的系统服务了.window中也可以注册成为系统服务的办法. service命令用的次数真不少,就是比较多的关联点,用了很多次了,还是有些 ...

  4. CCLayer在Touch事件(Standard Touch Delegate和Targeted Touch Delegate)

    在做练习,触摸故障,看到源代码,以了解下触摸事件. 练习操作:直CClayer子类init在 this->setTouchEnabled(true); 事件处理方法覆盖 virtual bool ...

  5. [渣译文] SignalR 2.0 系列:SignalR的高频实时通讯

    原文:[渣译文] SignalR 2.0 系列:SignalR的高频实时通讯 英文渣水平,大伙凑合着看吧…… 这是微软官方SignalR 2.0教程Getting Started with ASP.N ...

  6. 一个vbs文件将指定文件夹下的文件名输出到指定文件夹下

    'on error resume NextConst MY_COMPUTER=&H11& Const WINDOW_HANDLE=0 Const OPTIONS=0 '设置我的电脑为根 ...

  7. CodeCounter代码统计

    今天一天写的,困死了 开发环境:VS2012 + WIN8-x64, MFC CSDN下载链接:http://download.csdn.net/detail/npu_wy/7405577 百度云下载 ...

  8. POJ1251 Jungle Roads 【最小生成树Prim】

    Jungle Roads Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 19536   Accepted: 8970 Des ...

  9. 分布式数据库中间件–(2) Cobar与client握手身份验证

    Cobar启动完毕,监听特定端口.整个认证的流程图: NIOAcceptor类继承自Thread类,该类的对象会以线程的方式执行,进行连接的监听. NIOAcceptor启动的初始化步骤例如以下: 1 ...

  10. 跨域 Iframe 通信解决方案(兼容 IE 系列浏览器。)

    实现思路: 1.postMessage(IE8+, Firefox 3.1+, Opera 9+, Safari, and Chrome) 2.利用window.navigator共享信息,使支持IE ...