HttpUtil工具类,发送Get/Post请求,支持Http和Https协议

使用用Httpclient封装的HttpUtil工具类,发送Get/Post请求

1. maven引入httpclient依赖

  1. <dependency>
  2. <groupId>org.apache.httpcomponents</groupId>
  3. <artifactId>httpclient</artifactId>
  4. <version>4.5.12</version>
  5. </dependency>

2. GET请求

  1. public static String doGet(String path, Map<String, String> param, Map<String, String> headers) {
  2. HttpGet httpGet = null;
  3. CloseableHttpResponse response = null;
  4. CloseableHttpClient httpClient = wrapClient(path);
  5. // 创建uri
  6. URIBuilder builder = null;
  7. try {
  8. builder = new URIBuilder(path);
  9. if (param != null) {
  10. for (String key : param.keySet()) {
  11. builder.addParameter(key, param.get(key));
  12. }
  13. }
  14. URI uri = builder.build();
  15. // 创建http GET请求
  16. httpGet = new HttpGet(uri);
  17. if (headers != null && headers.size() > 0) {
  18. for (Map.Entry<String, String> entry : headers.entrySet()) {
  19. httpGet.addHeader(entry.getKey(), entry.getValue());
  20. }
  21. }
  22. // 执行请求
  23. response = httpClient.execute(httpGet);
  24. // 判断返回状态是否为200
  25. if (response.getStatusLine().getStatusCode() == 200) {
  26. return EntityUtils.toString(response.getEntity(), "UTF-8");
  27. }
  28. } catch (Exception e) {
  29. throw new RuntimeException("[发送Get请求错误:]" + e.getMessage());
  30. } finally {
  31. try {
  32. httpGet.releaseConnection();
  33. response.close();
  34. if (httpClient != null) {
  35. httpClient.close();
  36. }
  37. } catch (IOException e) {
  38. e.printStackTrace();
  39. }
  40. }
  41. return null;
  42. }

3. POST请求

  1. public static String doPostJson(String url, String jsonParam, Map<String, String> headers) {
  2. HttpPost httpPost = null;
  3. CloseableHttpResponse response = null;
  4. CloseableHttpClient httpClient = wrapClient(url);
  5. try {
  6. httpPost = new HttpPost(url);
  7. //addHeader,如果Header没有定义则添加,已定义则不变,setHeader会重新赋值
  8. httpPost.addHeader("Content-type","application/json;charset=utf-8");
  9. httpPost.setHeader("Accept", "application/json");
  10. StringEntity entity = new StringEntity(jsonParam, StandardCharsets.UTF_8);
  11. // entity.setContentType("text/json");
  12. // entity.setContentEncoding(new BasicHeader("Content-Type", "application/json;charset=UTF-8"));
  13. httpPost.setEntity(entity);
  14. //是否有header
  15. if (headers != null && headers.size() > 0) {
  16. for (Map.Entry<String, String> entry : headers.entrySet()) {
  17. httpPost.addHeader(entry.getKey(), entry.getValue());
  18. }
  19. }
  20. // 执行请求
  21. response = httpClient.execute(httpPost);
  22. // 判断返回状态是否为200
  23. if (response.getStatusLine().getStatusCode() == 200) {
  24. return EntityUtils.toString(response.getEntity(), "UTF-8");
  25. }
  26. } catch (Exception e) {
  27. throw new RuntimeException("[发送POST请求错误:]" + e.getMessage());
  28. } finally {
  29. try {
  30. httpPost.releaseConnection();
  31. response.close();
  32. if (httpClient != null) {
  33. httpClient.close();
  34. }
  35. } catch (IOException e) {
  36. e.printStackTrace();
  37. }
  38. }
  39. return null;
  40. }

3. 获取httpclient的方法

这里会根据url自动匹配需要的是http的还是https的client

  1. private static CloseableHttpClient wrapClient(String url) {
  2. CloseableHttpClient client = HttpClientBuilder.create().build();
  3. if (url.startsWith("https")) {
  4. client = getCloseableHttpsClients();
  5. }
  6. return client;
  7. }

4. 对于https的需要自己实现一下client

  1. private static CloseableHttpClient getCloseableHttpsClients() {
  2. // 采用绕过验证的方式处理https请求
  3. SSLContext sslcontext = createIgnoreVerifySSL();
  4. // 设置协议http和https对应的处理socket链接工厂的对象
  5. Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
  6. .register("http", PlainConnectionSocketFactory.INSTANCE)
  7. .register("https", new SSLConnectionSocketFactory(sslcontext)).build();
  8. PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
  9. HttpClients.custom().setConnectionManager(connManager);
  10. // 创建自定义的httpsclient对象
  11. CloseableHttpClient client = HttpClients.custom().setConnectionManager(connManager).build();
  12. return client;
  13. }
  14. private static SSLContext createIgnoreVerifySSL() {
  15. // 创建套接字对象
  16. SSLContext sslContext = null;
  17. try {
  18. //指定TLS版本
  19. sslContext = SSLContext.getInstance("TLSv1.2");
  20. } catch (NoSuchAlgorithmException e) {
  21. throw new RuntimeException("[创建套接字失败:] " + e.getMessage());
  22. }
  23. // 实现X509TrustManager接口,用于绕过验证
  24. X509TrustManager trustManager = new X509TrustManager() {
  25. @Override
  26. public void checkClientTrusted(java.security.cert.X509Certificate[] paramArrayOfX509Certificate,
  27. String paramString) throws CertificateException {
  28. }
  29. @Override
  30. public void checkServerTrusted(java.security.cert.X509Certificate[] paramArrayOfX509Certificate,
  31. String paramString) throws CertificateException {
  32. }
  33. @Override
  34. public java.security.cert.X509Certificate[] getAcceptedIssuers() {
  35. return null;
  36. }
  37. };
  38. try {
  39. //初始化sslContext对象
  40. sslContext.init(null, new TrustManager[]{trustManager}, null);
  41. } catch (KeyManagementException e) {
  42. throw new RuntimeException("[初始化套接字失败:] " + e.getMessage());
  43. }
  44. return sslContext;
  45. }

以上全部都测试通过,如果有错误,欢迎大佬们指出,感谢!!!

备注:完整版的点这里

让坚持成为品质,让优秀成为习惯!加油!

HttpUtil工具类,发送Get/Post请求,支持Http和Https协议的更多相关文章

  1. HttpUtil工具类

    HttpUtil工具类 /** * 向指定URL发送GET方法的请求 * * @param url * 发送请求的URL * @param params * 请求参数,请求参数应该是name1=val ...

  2. 牛客网Java刷题知识点之UDP协议是否支持HTTP和HTTPS协议?为什么?TCP协议支持吗?

    不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑          ...

  3. Spring Boot项目如何同时支持HTTP和HTTPS协议

    如今,企业级应用程序的常见场景是同时支持HTTP和HTTPS两种协议,这篇文章考虑如何让Spring Boot应用程序同时支持HTTP和HTTPS两种协议. 准备 为了使用HTTPS连接器,需要生成一 ...

  4. 通过Httpclient工具类,实现接口请求

    package luckyweb.seagull.util; import org.apache.http.NameValuePair; import org.apache.http.client.e ...

  5. httpclient4.5.2 Post请求支持http和https

    先导入所需的jar包,pom.xml <dependency> <groupId>org.springframework.boot</groupId> <ar ...

  6. 工具类: 用于模拟HTTP请求中GET/POST方式

    package com.jarvis.base.util; import java.io.BufferedReader; import java.io.IOException; import java ...

  7. 工具类总结---(六)---之http及https请求

    下面使用的是HttpURLConnection进行的网络链接,并对https进行了忽略证书. 在这个utils里面,也使用到前面几个utils,比如下载文件的方法,就使用到了Fileutils pac ...

  8. 自己写的Android端HttpUtil工具类

    package com.sxt.jcjd.util; import java.io.IOException; import java.io.UnsupportedEncodingException; ...

  9. HttpClientUtil 工具类 实现跨域请求数据

    package com.xxx.common.util; import java.io.IOException; import java.net.URI; import java.util.Array ...

随机推荐

  1. mysql设置文档快捷写

    select distinct column_name,column_comment,column_type from information_schema.columns where table_n ...

  2. CukeTest+Puppeteer的Web自动化测试(一)

    CukeTest+Puppeteer的Web自动化测试 一.初识BDD.Cucumber(黄瓜).CukeTest 行为驱动开发(Behavior Driven Development,BDD).行为 ...

  3. 在 n 道题目中挑选一些使得所有人对题目的掌握情况不超过一半。

    Snark and Philip are preparing the problemset for the upcoming pre-qualification round for semi-quar ...

  4. BZOJ4260异或和

    4260: Codechef REBXOR Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 918  Solved: 420[Submit][Statu ...

  5. Mybatis 强大的结果集映射器resultMap

    1. 前言 resultMap 元素是 MyBatis 中最重要最强大的元素.它可以让你从 90% 的 JDBC ResultSets 数据提取代码中解放出来,并在一些情形下允许你进行一些 JDBC ...

  6. SQL——TOP、IN、BETWEEN AND、IS NULL和IS NOT NULL

    TOP子句 - 用于规定要返回的记录的数目.并不是所有数据库都支持TOP子句.    语法:        SQLServer:SELECT TOP number|percent columnName ...

  7. (一) Vue在创建的时候 入口文件 及相关的路由配置(及子路由配置)

    1. 首先明确一点  在书写之前尽量保持相关的文件知道含义 比如 components 啥的 知道是要放什么东西 在这里介绍一下   由于 vue 不是系统学习 所以很多的创建方式可能不一样  就是有 ...

  8. Docker 入门:什么是 Docker ?

    Docker 解决了软件环境部署复杂的问题. 对于一个传统的软件工程,开发人员把写好的代码放到服务器上去运行是一件很头疼的事情,因为常常会出现环境不兼容而导致各种各样的 Bug. 比如说,开发是在 w ...

  9. Java——参数传递

    写这篇文章时,其实还是不理解Java中的参数传递只有传值没有传址(传引用).这里引用知乎上大神的讲解来记录一下. 一.基本类型和引用类型 int num = 10; String str = &quo ...

  10. Java rmi漏洞利用及原理记录

    CVE-2011-3556 该模块利用了RMI的默认配置.注册表和RMI激活服务,允许加载类来自任何远程(HTTP)URL.当它在RMI中调用一个方法时分布式垃圾收集器,可通过每个RMI使用endpo ...