java 执行https的请求

普通的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:

<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>

2、主要类HttpClientService

  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 }

3、调用方法

 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 }

4、对于发送https

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

写一个SSLClient类,继承至HttpClient

 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 }

5、对于https调用

原文地址:https://www.cnblogs.com/tiandi/p/10719666.html

时间: 2024-10-31 23:06:27

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

使用java发送https的请求

package api.basic; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.URL; import java.security.cert.CertificateException; import java.util.Map; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnect

java 实现https请求

java 实现https请求 JSSE是一个SSL和TLS的纯Java实现,通过JSSE可以很容易地编程实现对HTTPS站点的访问.但是,如果该站点的证书未经权威机构的验证,JSSE将拒绝信任该证书从而不能访问HTTPS站点.本文在简要介绍JSSE的基础上提出了两种解决该问题的方法. 引言 过去的十几年,网络上已经积累了大量的Web应用.如今,无论是整合原有的Web应用系统,还是进行新的Web开发,都要求通过编程来访问某些Web 页面.传统的方法是使用Socket接口,但现在很多开发平台或工具如

关于JAVA发送Https请求(HttpsURLConnection和HttpURLConnection)

关于JAVA发送Https请求(HttpsURLConnection和HttpURLConnection) [转] https协议对于开发者而言其实只是多了一步证书验证的过程.这个证书正常情况下被jdk/jre/security/cacerts所管理.里面证书包含两种情况: 1.机构所颁发的被认证的证书,这种证书的网站在浏览器访问时https头显示为绿色如百度 2.个人所设定的证书,这种证书的网站在浏览器里https头显示为红色×,且需要点击信任该网站才能继续访问.而点击信任这一步的操作就是我们

Java GET和POST请求

从表面来看GET和POST请求: GET请求是在url后直接附上请求体,url和请求体之间用"?"分割,不同参数之间用"&"分隔,%XX中的XX为该符号以16进制表示的ASCII,如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密. POST把提交的数据则放置在是HTTP包的包体中,Post没有限制提交的数据.Post比Get安全,当数据是中文或者不敏感的数据,则用get,因为使用get,参数会显

如何通过抓包工具fiddler获取java程序的http请求

原文:如何通过抓包工具fiddler获取java程序的http请求 源代码下载地址:http://www.zuidaima.com/share/1550463683824640.htm 抓包工具fidder是一个很轻巧的可以获取浏览器,程序的http,https请求的软件. 百科地址:http://baike.baidu.com/view/868685.htm 官网地址:http://fiddler2.com/ firefox的fidder插件 而java程序需要设置proxy才能生效: Pro

【fastweixin框架教程3】JAVA进行HTTPS网站访问,PKIX path building failed解决方法

上几篇文章我们谈到fastweixin使用问题和修改. 今天的问题就是使用JAVA访问HTTPS网站时候经常出现javax.net.ssl.SSLHandshakeException javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderEx

Java执行shell脚本关闭远程数据库

本实例为用Java执行shell脚本启动或关闭远程Mysql数据库,需求原因:游戏服务器合服后,为了节省内存消耗,需要关闭合服后的服务器不必要的数据库(一台服务器主机存在多个MySql数据库),以提高服务器性能,但有时需要查询历史游戏玩家信息,又需要开启数据库,为了节省运维人员的人力和时间,游戏后台就提供非运维人员都可操作开关数据库的操作. 功能实现步骤: 第一:服务器后台提供参数,发送异步请求,请求方法如下 <script type="text/javascript">

java 执行 cmd 命令(转)

原文出处:http://blog.csdn.net/saindy5828/article/details/11975527 用JAVA代码实现执行CMD命令的方法 java的Runtime.getRuntime().exec(arstringCommand)可以调用执行cmd指令. public class Cmd{ public void execCommand(String[] arstringCommand) { for (int i = 0; i < arstringCommand.le

java执行shell脚本并输出执行情况

1.脚本test.sh,置于/Users/hdwang目录下 #!/bin/sh cd /Users/hdwang echo ls:`ls` for((i=1;i<=10;i++)); do echo $(expr $i \* 3 + 1); sleep 1s done echo jps:`jps -l` 2.java执行test.sh public class ExecShell { public static void main(String[] args) { try { Process