HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。虽然在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HttpClient 已经应用在很多的项目中,比如 Apache Jakarta 上很著名的另外两个开源项目 Cactus 和 HTMLUnit 都使用了 HttpClient。

当前官网最新版介绍页是:Apache HttpComponents – HttpClient Overview

使用HttpClient发送请求、接收响应很简单,一般需要如下几步即可:

  1. 创建CloseableHttpClient对象。
  2. 创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。
  3. 如果需要发送请求参数,可可调用setEntity(HttpEntity entity)方法来设置请求参数(包括body参数)。setParams方法已过时(4.4.1版本)。
  4. 调用HttpGet、HttpPost对象的setHeader(String name, String value)方法设置header信息,或者调用setHeaders(Header[] headers)设置一组header信息(addHeader也可以,但是set更好,因为set会去重)。
  5. 调用CloseableHttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个CloseableHttpResponse。
  6. 调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容;调用CloseableHttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头。
  7. 释放连接。无论执行方法是否成功,都必须释放连接

使用https就需要重新构建sslContext对象,把证书塞进去(因为可以改变策略的地方叫较多,很多人一开始被搞得晕头转向,不如全围绕sslContext来构建)

// 构建一个新的证书管理器,重写本该校验的方法,空的就行
public class AlltrustManager implements X509TrustManager {@Overridepublic void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {}@Overridepublic void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {}@Overridepublic X509Certificate[] getAcceptedIssuers() {return new X509Certificate[0];}
}

写一个https的工具类:

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import sun.misc.JavaSecurityAccess;import javax.net.ssl.SSLContext;
import javax.net.ssl.X509TrustManager;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Map;
import java.util.logging.Logger;public class HttpUtils {private static Logger logger = Logger.getLogger("HttpUtils.class");public static SSLContext createIgnoreVerifySSL() throws NoSuchAlgorithmException, KeyManagementException {//关键就是这个sslcontextSSLContext context = SSLContext.getInstance("SSLv3");X509TrustManager[] alltrustManager = new X509TrustManager[0];context.init(null,alltrustManager, new SecureRandom() );return context;}public static  String  doPostRequest(String url, Map<String,String> headers,String requestBody) throws NoSuchAlgorithmException, KeyManagementException {SSLContext sslcontext =createIgnoreVerifySSL();// 设置协议http和https对应的处理socket链接工厂的对象Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create().register("http", PlainConnectionSocketFactory.INSTANCE).register("https", new SSLConnectionSocketFactory(sslcontext)).build();PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);connManager.setMaxTotal(200);//最大连接数connManager.setDefaultMaxPerRoute(100);//单个服务并发数HttpClients.custom().setConnectionManager(connManager);//创建自定义的httpclient对象CloseableHttpClient client = HttpClients.custom().setConnectionManager(connManager).build();//创建post方式请求对象HttpPost httpPost = new HttpPost(url);//添加headerif (headers!=null){for (Map.Entry<String, String> entry : headers.entrySet()) {httpPost.setHeader(entry.getKey(), entry.getValue());}}//添加bodyByteArrayEntity entity = null;try {entity = new ByteArrayEntity(requestBody.getBytes("UTF-8"));entity.setContentType("application/json");} catch (UnsupportedEncodingException e) {logger.info("向服务器承保接口发起http请求,封装请求body时出现异常"+e);throw new RuntimeException("向服务器承保接口发起http请求,封装请求body时出现异常", e);}httpPost.setEntity(entity);//执行post请求HttpResponse response = null;try {response = client.execute(httpPost);} catch (IOException e) {logger.info("提交给服务器的请求,不符合HTTP协议"+ e);throw new RuntimeException("提交给服务器的请求,不符合HTTP协议", e);}logger.info("状态码:" + response.getStatusLine());return response.toString();}}

如果不想重写接口,也可以单独构造:

/**
* 绕过验证
*
* @return
* @throws NoSuchAlgorithmException
* @throws KeyManagementException
*/
public static SSLContext createIgnoreVerifySSL() throws NoSuchAlgorithmException, KeyManagementException {  SSLContext sc = SSLContext.getInstance("SSLv3");  // 实现一个X509TrustManager接口,用于绕过验证,不用修改里面的方法  X509TrustManager trustManager = new X509TrustManager() {  @Override  public void checkClientTrusted(  java.security.cert.X509Certificate[] paramArrayOfX509Certificate,  String paramString) throws CertificateException {  }  @Override  public void checkServerTrusted(  java.security.cert.X509Certificate[] paramArrayOfX509Certificate,  String paramString) throws CertificateException {  }  @Override  public java.security.cert.X509Certificate[] getAcceptedIssuers() {  return null;  }  };  sc.init(null, new TrustManager[] { trustManager }, null);  return sc;  }

然后来验证一下:

public final static void main(String[] args) throws Exception {String body = "";//采用绕过验证的方式处理https请求  SSLContext sslcontext = createIgnoreVerifySSL();  //设置协议http和https对应的处理socket链接工厂的对象  Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()  .register("http", PlainConnectionSocketFactory.INSTANCE)  .register("https", new SSLConnectionSocketFactory(sslcontext))  .build();  PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);  HttpClients.custom().setConnectionManager(connManager); //创建自定义的httpclient对象  CloseableHttpClient client = HttpClients.custom().setConnectionManager(connManager).build();  //CloseableHttpClient client = HttpClients.createDefault();try{//创建post方式请求对象  HttpPost httpPost = new HttpPost("https://api.douban.com/v2/book/1220562"); //指定报文头Content-type、User-AgenthttpPost.setHeader("Content-type", "application/x-www-form-urlencoded");  httpPost.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2");//执行请求操作,并拿到结果(同步阻塞)  CloseableHttpResponse response = client.execute(httpPost);  //获取结果实体  HttpEntity entity = response.getEntity(); if (entity != null) {  //按指定编码转换结果实体为String类型  body = EntityUtils.toString(entity, "UTF-8");  }  EntityUtils.consume(entity);  //释放链接  response.close(); System.out.println("body:" + body);}finally{client.close();}}

如果要使用自己的证书呢?

  sslcontext = SSLContexts.custom().loadTrustMaterial(new File("D://https//ca//cl.jks"),"123456".toCharArray(),new TrustSelfSignedStrategy()).build();具体可参考此文:http://www.javashuo.com/article/p-ooekqaim-e.html

参考:

使用HttpClient链接池进行https单双向验证 - JavaShuo

使用HttpClient发起请求时将参数放入requestBody中_weixin_33721344的博客-CSDN博客

轻松把玩HttpClient之配置ssl,采用绕过证书验证实现https_崔成龙 . 勇往直前-CSDN博客

HttpClient配置SSL绕过https证书_irokay的专栏-CSDN博客

HttpClient:绕开https证书(三)相关推荐

  1. 用HttpClient发送HTTPS请求报SSLException: Certificate for <域名> doesn‘t match any of the subject alternative

    目录 1:HttpClient 的https证书验证请求问题 2: post请求示例 3: get请求示例 1:HttpClient 的https证书验证请求问题 最近用http 推送,用apache ...

  2. http java ssl_使用HttpClient通过HTTPS信任所有证书

    使用HttpClient通过HTTPS信任所有证书 最近发布了一个关于HttpClient过度Https 的问题(在这里找到).我已经取得了一些进展,但我遇到了新的问题.和我的上一个问题一样,我似乎无 ...

  3. http三次握手_【吊打面试,击中要害】http三次握手四次挥手,https证书验证阶段和数据传输阶段...

    阅读文本大概需要3分钟. PPT: Jenkins与项目构建部署工具集成 0x01:tcp三次握手,四次挥手 三次握手(Three-way Handshake),是指在建立一个TCP连接时候,需要客户 ...

  4. HTTPS和HTTPS证书

    背景:我发现网上真的没有几个把https讲清楚的,更别说证书,以及证书安装,更是一堆没用的软文,所以在看了很多资料后做下记录 HTTPS协议 超文本传输安全协议(英语:Hypertext Transf ...

  5. 使用acme.sh撸一个免费且自动更新的HTTPS证书

    前言 一直想撸一下https,最近刚好有点空,就实现了一下.之前看过一篇教你快速撸一个免费HTTPS证书的文章,通过Certbot来管理Let's Encrypt的证书,使用前需要安装一堆库,觉得不太 ...

  6. HTTPS 证书配置

    HTTPS 证书配置 现在阿里云和腾讯云都支持申请 HTTPS 证书,这里不再提,有需要的可自行google解决方案. 本文主要介绍的是通过 letsencrypt 申请免费的HTTPS证书,并将其配 ...

  7. 小米手机上安装https证书(例如pem证书,crt证书)详解

    小米手机上安装https证书(例如pem证书,crt证书)关键三步: 1.使用第三方浏览器下载.pem 格式的文件 (我使用的是QQ浏览器) 2.将这个文件放入小米的 DownLoad 文件夹下 (这 ...

  8. 互联网公司分批返岗;Safari 将封杀超过398天的 HTTPS 证书;TypeScript 3.8 发布 | 极客头条...

    整理 | 屠敏 快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注 ...

  9. 阿里云域名配置以及https证书(ssl证书)配置

    阿里云域名配置以及https证书配置 目录: 一.tomcat 配置https 二.nginx 配置多个域名 最近开发小程序,小程序开发使用的所有接口都必须是https的 然后申请了阿里云服务器 申请 ...

最新文章

  1. 第十六届全国大学生智能车参赛与防疫承诺书
  2. 【转帖】Reporting Service rdl报表,在aspx页面显示一张完整的RDL报表
  3. h5是可以一键打包小程序的_H5手机网站封装打包微信小程序并实现分享及微信支付...
  4. [ZJOI2019]麻将
  5. 20145237 Exp2 后门原理与实践
  6. 计算机集成技术的研究和应用,信息系统集成技术研究
  7. scrt远程连接工具怎么切换窗口
  8. sqlserver 汉字转拼音(转载)
  9. 全球及中国没药香精油行业研究及十四五规划分析报告
  10. 哪个ppt模板网站好
  11. Java版本和JDK版本对应关系
  12. GBase 8c 安全特性
  13. 说说IO(七)- RAID
  14. 【算法竞赛从入门到精通】【基础算法】
  15. 通过ua区分QQ内置浏览器与QQ浏览器
  16. 基于python django框架的物联网平台即将开源,兼具IoT物联网平台和IBMS系统集成平台双重特性
  17. kakadu——JPEG2000图像压缩软件的安装和使用
  18. 历年数学建模大赛优秀论文解读
  19. 动软代码生成器分页存储过程
  20. IT xiao小巫的面试宝典

热门文章

  1. 使用 nc (Netcat) 建立傳送資料的 socket server
  2. DHH观点:为什么我偏爱Ruby?
  3. android r文件错误,Android R文件丢失异常原因汇总
  4. mac brew重装apache_记一次 Mac 安装 Pygame 报错的故事 -- 手把手系列~
  5. mysql日期序列填充_MySQL如何在范围内填充缺失的日期?
  6. mysql例题_mysql练习题1
  7. aes子密钥生成c语言_HBase配置AES加密
  8. java interface 函数_java8函数式接口(Functional Interface)
  9. qt插件元数据不包含一个有效的元数据_Qt5个人软件插件使用(低级API)
  10. 此版本的应用程序不支持其项目类型 (.etp)_适用于Microsoft Dynamics 365商业中心的VPS和VJS版本1.8...