如果周期比较长的项目,或者这个项目开发人员换过了好几拨人,很有可能出现一些奇怪的问题,比如一个项目中出现了多种Spring注入bean的方式,不同版本的jar冲突等等

爬虫项目有的时候更是过犹不及,拿模拟登陆来说,开发人员的迭代,每个人的风格和技术各不相同,模拟登陆的方式也是五花八门,早在之前看到过一个项目的源码,其中使用HttpClient也是各种风格,虽然官方已经强烈建议使用HttpClient 4.x之后版本,但是在该项目中均存在HttpClient 3.x的和HttpClient 4.x的创建Httpclient对象。造成风格不一,维护繁杂,而新进项目的同学又很难进行区分不易上手,是有可能继续使用旧代码造成不良循环。

本文针对以上的情况进行了详细讲述:

1.   关于HttpClient 3.x 和 HttpClient 4.x项目的历史

如下图所示:

原Commons HttpClient project(HttpClient 3.x) 是 Jakarta Commons 项目下的一个子项目,在2007年Commons项目独立,Commons摒弃了Httpclient 3.x,不再对其维护;而在早些年2005年Jakarta成立了子项目HttpComponents项目用于开发HttpClients 3.x的替代项目HttpClient 4.x。就在Commons项目脱离Jakarta项目的同年2007年,HttpComponents也脱离Jakarta项目成为Apache顶级项目,进行开发维护HttpClient 4.x及后续版本。

从Httpclient历史中可以看出早在2005年Apache就有了要取代3.x的打算,成立了单独项目HttpComponents,并在两年后发布4.x版本取代了3.x。

Apache官方公告链接:https://hc.apache.org/httpclient-3.x/

2.   区分HttpClient 3.x 和 HttpClient 4.x 的jar包

如下图所示,如果是HttpClient 3.x 在项目中需要引入 import org.apache.commons.httpclient。而HttpClient 4.x 则需要引入 import org.apache.http.client.HttpClient。

另外关于3.x和4.x的jar包依赖,在上图中可以看出,3.x的jar依赖于commons-logging和commons-codec。而4.x依赖于httpcore、commons-logging和commons-codec。从下图的maven依赖中也可以清晰的看出区分。

3.   HttpClient 3.x 升级到 4.x 的参照表总结如下:

  Commons HttpClient 3.x HttpComponents HttpClient 4.x
import

import org.apache.commons.httpclient.Cred;font-family:Consolas, SimSun, Helvetica, sans-serif;font-size:13px;entials;

import org.apache.commons.httpclient.Header;

import org.apache.commons.httpclient.HostConfiguration;

import org.apache.commons.httpclient.HttpClient;

import org.apache.commons.httpclient. MultiThreadedHttpConnectionManager;

import org.apache.commons.httpclient. UsernamePasswordCredentials;

import org.apache.commons.httpclient.auth.AuthScope;

import org.apache.commons.httpclient.methods.DeleteMethod;

import org.apache.commons.httpclient.methods.GetMethod;

import org.apache.commons.httpclient.methods.PostMethod;

import org.apache.http.Header;

import org.apache.http.HttpEntity;

import org.apache.http.HttpHost;

import org.apache.http.HttpResponse;

import org.apache.http.auth.AuthScope;

import org.apache.http.auth.Credentials;

import org.apache.http.auth.UsernamePasswordCredentials;

import org.apache.http.client.HttpClient;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.client.methods.HttpPost;

import org.apache.http.conn.params.ConnRoutePNames;

import org.apache.http.entity.ContentType;

import org.apache.http.entity.StringEntity;

import org.apache.http.impl.client.DefaultHttpClient;

import org.apache.http.util.EntityUtils;

HttpClient HttpClient client = new HttpClient(connectionManager);

DefaultHttpClient client = new DefaultHttpClient(); // 4.3版本前

// 4.3版本后的创建方式见表下方代码

proxy configuration

client.getHostConfiguration().setProxy( proxyHost, proxyPort);

client.getState().setAuthenticationPreemptive( true);

Credentials cred = new  UsernamePasswordCredentials(proxyUser, proxyPassword);

client.getState().setProxyCredentials(AuthScope.ANY_HOST, proxyHost, cred)

client.getCredentialsProvider().setCredentials(

new AuthScope(proxyHost, proxyPort),

new UsernamePasswordCredentials(proxyUser, proxyPassword));

HttpHost proxy = new HttpHost(proxyHost proxyPort);

client.getParams().setParameter( ConnRoutePNames.DEFAULT_PROXY, proxy);

GET

GetMethod getMethod = new GetMethod();

getMethod.setPath(url.getFile());

HttpGet httpGet = new HttpGet(url.getFile());
GET Header getMethod.setRequestHeader(key, value); httpGet.addHeader(key, value);
Execute GET client.executeMethod(getMethod);

HttpHost targetHost = new HttpHost(url.getHost(), url.getPort(), url.getProtocol());

HttpResponse httpResponse = client.execute( targetHost, httpGet);

POST

PostMethod post = new PostMethod();

post.setPath(url.getFile());

HttpPost post = new HttpPost(url.getFile());
POST Header post.setRequestHeader(key, (String) headers.get(key)); post.addHeader(key, (String) headers.get(key));
POST Body post.setRequestBody(message);

StringEntity messageEntity = new StringEntity( message,

ContentType.create("text/plain", "UTF-8"));

post.setEntity(messageEntity);

Execute POST client.executeMethod(post);

HttpHost targetHost = new HttpHost(url.getHost(), url.getPort(), url.getProtocol());

HttpResponse httpResponse = client.execute(targetHost, post);

Response Header Header[] rspHeaders = post.getResponseHeaders(); Header[] rspHeaders = httpResponse.getAllHeaders();
Response Body String responseMsg = post.getResponseBodyAsString()

StringBuffer buffer = new StringBuffer();

BufferedReader reader = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent()));

String dataLine = null;

while((dataLine = reader.readLine()) != null){

buffer.append(dataLine);

}

String responseMsg =    buffer.toString();

在上表中需要注意的是:如果是HttpClient 4.3之后的版本,创建HttpClient对象的方法有如下几种:

// 一般默认的创建HC对象的方法,实际上底层实现为:HttpClientBuilder.create().build()
CloseableHttpClient httpClient = HttpClients.createDefault(); // HttpClientBuilder 创建HC对象的各种方式
CloseableHttpClient closeableHttpClient = new HTTPClientBuilder().build();CloseableHttpClient closeableHttpClient = new HTTPClientBuilder().withCookiesStore().build();CloseableHttpClient closeableHttpClient = new HTTPClientBuilder().withGlobalConfig().build();CloseableHttpClient closeableHttpClient = new HTTPClientBuilder().withSllContext().build();CloseableHttpClient closeableHttpClient = new HTTPClientBuilder().withCookiesStore().withGlobalConfig().withSllContext().build();

4.   HttpClient 3.x 和 4.x 废弃API一览:

在每个版本的HttpClient中都有Deprecated list(废弃API一览),下面的官方连接中可以方便查询到官方不建议使用的API,这些API如果继续使用会和JDK的API一样出现删除线。

3.x 版本 https://hc.apache.org/httpclient-3.x/apidocs/deprecated-list.html
4.x 版本 https://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/deprecated-list.html

5.   HttpClient 3.x 和 4.x 的常量变化一览:

在无论是3.x还是4.x的版本中,默认都定义了常量文件,里面提供了默认的状态码,协议头等等的常量,这样一些常用的就不需要自己再次定义了,可以直接使用HttpClient的常量类直接来使用,具体的详细常量参照下面的链接:

3.x 版本 https://hc.apache.org/httpclient-3.x/apidocs/constant-values.html
4.x 版本 https://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/constant-values.html

6.   HttpClient 3.x 和 4.x 超时Timeout设置变化:

HttpClient 3.x

HttpClient client = new HttpClient();
client.setConnectionTimeout(5000);
client.setTimeout(5000);HttpClient httpClient= new HttpClient();
httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(5000);

HttpClient 4.x到HttpClient4.3以下

HttpClient httpClient=new DefaultHttpClient();
httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,5000);
httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT,5000);

HttpClient4.3以上

CloseableHttpClient httpClient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet("https://www.csdn.net/");
RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(5000).setConnectTimeout(5000).build();
httpGet.setConfig(requestConfig);
httpClient.execute(httpGet);

7.   对于HttpClient 4.5.x 之后的版本废弃API版本替代策略(针对SSL相关API)

HttpClient4.5之后依然有很多的变化,其中一些API也废弃掉了。
下文针对 4.x 以后 SSL证书验证相关废弃(@Deprecated)API提供了最新的替换策略。

HttpClient 4.5.x 之后 Deprecated 废弃API 的替代对应策略:https://blog.csdn.net/dietime1943/article/details/86705539

8.   其他一些有用的链接:

HttpClient官方指南教程:https://hc.apache.org/httpcomponents-client-ga/tutorial/html/index.html

What does setDefaultMaxPerRoute and setMaxTotal mean in HttpClient?
https://stackoverflow.com/questions/30689995/what-does-setdefaultmaxperroute-and-setmaxtotal-mean-in-httpclient

注:本文原创由`bluetata`发布于blog.csdn.net、转载请务必注明出处。

扫清盲点,如何正确的从HttpClient 3.x系统升级到HttpClient 4.x相关推荐

  1. java httpclient 重定向_如何在HttpClient中自动重定向(java,apache)

    我创建了httpClient并设置了设置 HttpClient client = new HttpClient(); client.getParams().setCookiePolicy(Cookie ...

  2. httpclient 调取接口_使用HttpClient调用接口的实例讲解

    一,编写返回对象 public class HttpResult { // 响应的状态码 private int code; // 响应的响应体 private String body; get/se ...

  3. java httpclient 跨域_13、HttpClient服务器跨域请求

    1 回调 1.1 回调函数 1.1.1 回调的原理图 说明:在架构设计中,回调的机制经常会被使用,课下自行学习. 1.2 JSON的数据结构 1.2.1 JSON官网介绍 1.2.2 Object格式 ...

  4. php httpclient.class.php,php实现httpclient类示例

    代码如下: httpClient::init($httpClient, $args = null); $httpClient->get($url, $data = null, $cookie = ...

  5. java httpclient put_[工具类-HttpClientUtils]HttpClient之GET PUT DELETE POST

    图片来自网络 发送http请求: get put delete post package com.zefun.common.utils; import java.io.IOException; imp ...

  6. java httpclient 关闭_java中使用httpclient如何关闭debug日志

    直接上代码,在http请求前加上下面的代码即可// 设置默认工厂类 system.setproperty("org.apache.commons.logging.logfactory&quo ...

  7. java httpclient 重定向_用Apache HttpClient实现URL重定向

    很多网站都使用了URL重定向技术,把一个原始请求从一个位置路由到另一个位置.原因可能是多方面的,比如域名转发.URL缩写.隐私保护.在同一网站维持相似的域名等. 本文讲述怎样使用Apache HTTP ...

  8. java httpclient 异步请求_java_java实现HttpClient异步请求资源的方法,本文实例讲述了java实现HttpClien - phpStudy...

    java实现HttpClient异步请求资源的方法 本文实例讲述了java实现HttpClient异步请求资源的方法.分享给大家供大家参考.具体实现方法如下: package demo; import ...

  9. apache httpclient 工具类_使用HttpClient进行服务的远程调用

    目标:使用apache公司的产品http httpcomponents 完成服务调用. HTTPClient调用服务 4:导入httpclient的依赖配置 org.apache.httpcompon ...

  10. android httpclient 乱码,【问题解决】HttpClient解析服务器返回的response出现乱码

    问题场景 最近在用httpClient做网络爬虫的时候,遇到了一个不大不小的问题,当使用HttpGet向指定网址发送请求后,接收到的Response无法正常解析,出现 口口??这样的乱码,编码也考虑到 ...

最新文章

  1. c语言long int表示范围_C语言编程第9讲——这些C语言整数类型的知识点你掌握了吗...
  2. Managed Extensibility Framework (MEF)
  3. 《LeetCode力扣练习》第12题 C语言版 (做出来就行,别问我效率。。。。)
  4. 使用卷积神经网络识别交通标志
  5. 什么字体字母和数字大小一样_字母和字体如何适应我们的屏幕
  6. php mysql 执行sql文件_PHP执行SQL文件并将SQL文件导入到数据库_PHP
  7. C++描述杭电OJ 2000. ASCII码排序 ||
  8. 使用Servlet 3.0,Redis / Jedis和CDI的简单CRUD –第1部分
  9. JavaScript强化教程 —— Cocos2d-JS极速调试技巧
  10. Swing超市收银系统附图
  11. LeetCode简单题目(#53 #58 #66 #67 #69 #70 #83 #88)-8道
  12. does not point to a valid jvm installation
  13. 学习云计算有什么用处 该怎么学好云计算技术
  14. 小草酒店客房管理系统 免费
  15. 电机编码器调零步骤_各种编码器调零方法
  16. python skimage 填补图像孔洞
  17. 计算机网络中 89 个常见的概念
  18. TIA WinCC Unified入门经典
  19. python 廖雪峰_实战 - 廖雪峰的官方网站
  20. “3亿”风暴席卷昆明 搜狗全国移动峰会即将开幕

热门文章

  1. HCNA-IP地址规划练习
  2. 单片机(STM32)内部RC振荡器误差时间到底有多少
  3. 分享几个HIFI音乐下载网站
  4. 尚学堂马士兵 Struts2 笔记心得修改版
  5. 关于软件设计文档编写
  6. 数学建模评价类方法01——灵敏度分析
  7. c语言char sex是什么意思,2012年计算机二级C语言入门教程:结构体
  8. 计算机函数sun怎么用,excel函数怎么使用
  9. 家里计算机网络布局图,图解八种家庭网络常规布局优缺点
  10. Linux小练习(2)----利用FIFO实现本地聊天室(C/S模式)