当前位置:首页 > 后端开发 > java 执行https的请求

java 执行https的请求

6个月前 (05-26)43

普通的get和post请求只能执行http的请求,遇到的了https的就歇菜了,需要SSL安全证书处理。

该方法只能用jdk1.7和1.8进行处理,jdk1.6会报Could not generate DH keypair的错误。

1、引入相关依赖包

jar包下载:httpcore4.5.5.jar    fastjson-1.2.47.jar

maven:

java 执行https的请求 _ Java侠
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.5</version>
</dependency>

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.47</version>
</dependency>
java 执行https的请求 _ Java侠

 

2、主要类HttpClientService

java 执行https的请求 _ Java侠
  1 package com.sinotn.service;
  2 
  3 import com.alibaba.fastjson.JSONObject;
  4 import org.apache.http.HttpEntity;
  5 import org.apache.http.NameValuePair;
  6 import org.apache.http.client.entity.UrlEncodedFormEntity;
  7 import org.apache.http.client.methods.CloseableHttpResponse;
  8 import org.apache.http.client.methods.HttpGet;
  9 import org.apache.http.client.methods.HttpPost;
 10 import org.apache.http.client.utils.URIBuilder;
 11 import org.apache.http.entity.StringEntity;
 12 import org.apache.http.impl.client.CloseableHttpClient;
 13 import org.apache.http.impl.client.HttpClients;
 14 import org.apache.http.message.BasicHeader;
 15 import org.apache.http.message.BasicNameValuePair;
 16 import org.apache.http.util.EntityUtils;
 17 import org.slf4j.Logger;
 18 import org.slf4j.LoggerFactory;
 19 import java.util.ArrayList;
 20 import java.util.List;
 21 
 22 /**
 23  * HttpClient发送GET、POST请求
 24  * @Author libin
 25  * @CreateDate 2018.5.28 16:56
 26  */
 27 public class HttpClientService {
 28 
 29     private static final Logger LOGGER = LoggerFactory.getLogger(HttpClientService.class);
 30     /**
 31      * 返回成功状态码
 32      */
 33     private static final int SUCCESS_CODE = 200;
 34 
 35     /**
 36      * 发送GET请求
 37      * @param url   请求url
 38      * @param nameValuePairList    请求参数
 39      * @return JSON或者字符串
 40      * @throws Exception
 41      */
 42     public static Object sendGet(String url, List<NameValuePair> nameValuePairList) throws Exception{
 43         JSONObject jsonObject = null;
 44         CloseableHttpClient client = null;
 45         CloseableHttpResponse response = null;
 46         try{
 47             /**
 48              * 创建HttpClient对象
 49              */
 50             client = HttpClients.createDefault();
 51             /**
 52              * 创建URIBuilder
 53              */
 54             URIBuilder uriBuilder = new URIBuilder(url);
 55             /**
 56              * 设置参数
 57              */
 58             uriBuilder.addParameters(nameValuePairList);
 59             /**
 60              * 创建HttpGet
 61              */
 62             HttpGet httpGet = new HttpGet(uriBuilder.build());
 63             /**
 64              * 设置请求头部编码
 65              */
 66             httpGet.setHeader(new BasicHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8"));
 67             /**
 68              * 设置返回编码
 69              */
 70             httpGet.setHeader(new BasicHeader("Accept", "text/plain;charset=utf-8"));
 71             /**
 72              * 请求服务
 73              */
 74             response = client.execute(httpGet);
 75             /**
 76              * 获取响应吗
 77              */
 78             int statusCode = response.getStatusLine().getStatusCode();
 79 
 80             if (SUCCESS_CODE == statusCode){
 81                 /**
 82                  * 获取返回对象
 83                  */
 84                 HttpEntity entity = response.getEntity();
 85                 /**
 86                  * 通过EntityUitls获取返回内容
 87                  */
 88                 String result = EntityUtils.toString(entity,"UTF-8");
 89                 /**
 90                  * 转换成json,根据合法性返回json或者字符串
 91                  */
 92                 try{
 93                     jsonObject = JSONObject.parseObject(result);
 94                     return jsonObject;
 95                 }catch (Exception e){
 96                     return result;
 97                 }
 98             }else{
 99                 LOGGER.error("HttpClientService-line: {}, errorMsg{}", 97, "GET请求失败!");
100             }
101         }catch (Exception e){
102             LOGGER.error("HttpClientService-line: {}, Exception: {}", 100, e);
103         } finally {
104             response.close();
105             client.close();
106         }
107         return null;
108     }
109 
110     /**
111      * 发送POST请求
112      * @param url
113      * @param nameValuePairList
114      * @return JSON或者字符串
115      * @throws Exception
116      */
117     public static Object sendPost(String url, List<NameValuePair> nameValuePairList) throws Exception{
118         JSONObject jsonObject = null;
119         CloseableHttpClient client = null;
120         CloseableHttpResponse response = null;
121         try{
122             /**
123              *  创建一个httpclient对象
124              */
125             client = HttpClients.createDefault();
126             /**
127              * 创建一个post对象
128              */
129             HttpPost post = new HttpPost(url);
130             /**
131              * 包装成一个Entity对象
132              */
133             StringEntity entity = new UrlEncodedFormEntity(nameValuePairList, "UTF-8");
134             /**
135              * 设置请求的内容
136              */
137             post.setEntity(entity);
138             /**
139              * 设置请求的报文头部的编码
140              */
141             post.setHeader(new BasicHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8"));
142             /**
143              * 设置请求的报文头部的编码
144              */
145             post.setHeader(new BasicHeader("Accept", "text/plain;charset=utf-8"));
146             /**
147              * 执行post请求
148              */
149             response = client.execute(post);
150             /**
151              * 获取响应码
152              */
153             int statusCode = response.getStatusLine().getStatusCode();
154             if (SUCCESS_CODE == statusCode){
155                 /**
156                  * 通过EntityUitls获取返回内容
157                  */
158                 String result = EntityUtils.toString(response.getEntity(),"UTF-8");
159                 /**
160                  * 转换成json,根据合法性返回json或者字符串
161                  */
162                 try{
163                     jsonObject = JSONObject.parseObject(result);
164                     return jsonObject;
165                 }catch (Exception e){
166                     return result;
167                 }
168             }else{
169                 LOGGER.error("HttpClientService-line: {}, errorMsg:{}", 146, "POST请求失败!");
170             }
171         }catch (Exception e){
172             LOGGER.error("HttpClientService-line: {}, Exception:{}", 149, e);
173         }finally {
174             response.close();
175             client.close();
176         }
177         return null;
178     }
179 
180     /**
181      * 组织请求参数{参数名和参数值下标保持一致}
182      * @param params    参数名数组
183      * @param values    参数值数组
184      * @return 参数对象
185      */
186     public static List<NameValuePair> getParams(Object[] params, Object[] values){
187         /**
188          * 校验参数合法性
189          */
190         boolean flag = params.length>0 && values.length>0 &&  params.length == values.length;
191         if (flag){
192             List<NameValuePair> nameValuePairList = new ArrayList<>();
193             for(int i =0; i<params.length; i++){
194                 nameValuePairList.add(new BasicNameValuePair(params[i].toString(),values[i].toString()));
195             }
196             return nameValuePairList;
197         }else{
198             LOGGER.error("HttpClientService-line: {}, errorMsg:{}", 197, "请求参数为空且参数长度不一致");
199         }
200         return null;
201     }
202 }
java 执行https的请求 _ Java侠

 3、调用方法

java 执行https的请求 _ Java侠
 1 package com.sinotn.service.impl;
 2 
 3 import com.sinotn.service.HttpClientService;
 4 import org.apache.http.NameValuePair;
 5 
 6 import java.util.List;
 7 
 8 /**
 9  * 发送post/get 测试类
10  */
11 public class Test {
12 
13     public static void main(String[] args) throws Exception{
14         String url = "要请求的url地址";
15         /**
16          * 参数值
17          */
18         Object [] params = new Object[]{"param1","param2"};
19         /**
20          * 参数名
21          */
22         Object [] values = new Object[]{"value1","value2"};
23         /**
24          * 获取参数对象
25          */
26         List<NameValuePair> paramsList = HttpClientService.getParams(params, values);
27         /**
28          * 发送get
29          */
30         Object result = HttpClientService.sendGet(url, paramsList);
31         /**
32          * 发送post
33          */
34         Object result2 = HttpClientService.sendPost(url, paramsList);
35 
36         System.out.println("GET返回信息:" + result);
37         System.out.println("POST返回信息:" + result2);
38     }
39 }
java 执行https的请求 _ Java侠

4、对于发送https

为了避免需要证书,所以用一个类继承DefaultHttpClient类,忽略校验过程。

写一个SSLClient类,继承至HttpClient

java 执行https的请求 _ Java侠
 1 import java.security.cert.CertificateException;
 2 import java.security.cert.X509Certificate;
 3 import javax.net.ssl.SSLContext;
 4 import javax.net.ssl.TrustManager;
 5 import javax.net.ssl.X509TrustManager;
 6 import org.apache.http.conn.ClientConnectionManager;
 7 import org.apache.http.conn.scheme.Scheme;
 8 import org.apache.http.conn.scheme.SchemeRegistry;
 9 import org.apache.http.conn.ssl.SSLSocketFactory;
10 import org.apache.http.impl.client.DefaultHttpClient;
11 //用于进行Https请求的HttpClient
12 public class SSLClient extends DefaultHttpClient{
13     public SSLClient() throws Exception{
14         super();
15         SSLContext ctx = SSLContext.getInstance("TLS");
16         X509TrustManager tm = new X509TrustManager() {
17                 @Override
18                 public void checkClientTrusted(X509Certificate[] chain,
19                         String authType) throws CertificateException {
20                 }
21                 @Override
22                 public void checkServerTrusted(X509Certificate[] chain,
23                         String authType) throws CertificateException {
24                 }
25                 @Override
26                 public X509Certificate[] getAcceptedIssuers() {
27                     return null;
28                 }
29         };
30         ctx.init(null, new TrustManager[]{tm}, null);
31         SSLSocketFactory ssf = new SSLSocketFactory(ctx,SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
32         ClientConnectionManager ccm = this.getConnectionManager();
33         SchemeRegistry sr = ccm.getSchemeRegistry();
34         sr.register(new Scheme("https", 443, ssf));
35     }
36 }
java 执行https的请求 _ Java侠

5、对于https调用

java 执行https的请求 _ Java侠

作者:JackGIS
来源链接:https://www.cnblogs.com/tiandi/p/10719666.html

标签: HTTPS

“java 执行https的请求” 的相关文章

解决jsoup抓取https问题

在执行抓取之前让我们的站点信任所有站点,不需要引包,系统自带ssl证书校验 import javax.net.ssl.*; import ja...

一文搭建自己博客/文档系统:搭建,自动编译和部署,域名,HTTPS,备案等

一文搭建自己博客/文档系统:搭建,自动编译和部署,域名,HTTPS,备案等

本文纯原创,搭建后的博客/文档网站可以参考: Java 全栈知识体系。如需转载请说明原处。 文章内容目录 第一部分 - 博客/文档系统的搭建...

https访问http加载不出图片

在我们开发的过程中之前用的不是http ,后面启用了https 网页里面有http连接的图片 在 targetSdkVersion 改为27 后升级之后 ,...

c#中https通讯如何添加证书

c#如何在https在通讯中需要添加证书密码 public static class HTTPS { // byte[]...

Tomcat9使用免费的Https证书加密网站

Tomcat9使用免费的Https证书加密网站

本文第二部分介绍如果获取免费的证书,第三部分介绍如何用已有的证书在Tomcat中配置,使得Https能够运作,最后一部分介绍,如何在浏览器中输入地址,自动由Http转发到Https上,有...

https下调用http

https下调用http

关于https和http的区别,遇到 RT 的问题,基本概念应该是清楚的,以下说明如何在开发中解决 https下调用http接口。 我解决这个...

HTTPS具体流程

HTTPS具体流程

【前两天被同学问到了这个问题,结果自己答成了三握...炒鸡尴尬,所以特此学习记录一下】 三次握手是建立TCP可靠通信的~ HTTPS通信流程环节...

haproxy反向代理环境部署(http和https代理)

haproxy反向代理环境部署(http和https代理)

  操作背景:前方有一台haproxy代理机器(115.100.120.57/192.168.1.7),后方两台realserver机器(192.168.1.150、19...

https 自签名SSL证书

https 自签名SSL证书

介绍 TLS或称传输层安全性,及其前身SSL(代表安全套接字层)是用于将正常流量包装在受保护的加密包装中的Web协议。 使用这种技术,服务器可以在服务器和客户端之间安全地发送...

全面了解http和https

全面了解http和https

序言 Http和Https属于计算机网络范畴,但作为开发人员,不管是后台开发或是前台开发,都很有必要掌握它们。 在学习Http和Http...