精华内容
下载资源
问答
  • 如果直接用HttpClient发送https请求的时候报错:sun.security.validator.ValidatorException:PKIXpathbuildingfailed:sun.security.provider.certpath.SunCertPathBuilderException:...

    如果直接用HttpClient发送https请求的时候报错:

    sun.security.validator.ValidatorException:PKIXpathbuildingfailed:sun.security.provider.certpath.SunCertPathBuilderException:unabletofindvalidcertificationpathtorequestedtarget.

    一般有以下两种方式解决解决这个问题。

    1.绕开校验环节,重写相关实现类

    public static CloseableHttpClient getClient() {

    SSLContext sslContext = null;

    try {

    sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {

    // 信任所有

    public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {

    return true;

    }

    }).build();

    } catch (NoSuchAlgorithmException ex) {

    Logger.getLogger(VerfiyCodeUtils.class.getName()).log(Level.SEVERE, null, ex);

    } catch (KeyStoreException ex) {

    Logger.getLogger(VerfiyCodeUtils.class.getName()).log(Level.SEVERE, null, ex);

    } catch (KeyManagementException ex) {

    Logger.getLogger(VerfiyCodeUtils.class.getName()).log(Level.SEVERE, null, ex);

    }

    //NoopHostnameVerifier类:  作为主机名验证工具,实质上关闭了主机名验证,它接受任何有效的SSL会话并匹配到目标主机。

    HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE;

    SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, hostnameVerifier);

    CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build();

    return httpClient;

    }

    public static void main(String[] args){

    HttpPost httpPost = new HttpPost("https:abc");

    CloseableHttpClient httpClient = getClient();

    CloseableHttpResponse response = httpClient.execute(httpPost);

    }

    2.导出https网站的cer证书,重新生成java cacerts证书

    (1)从相应https网站导出网站证书

    谷歌浏览器打开https网站后,点击url地址栏前面的安全,点击证书,显示证书对话框,点击上面标签页,详细信息,下面的复制到文件,打开导出证书对话框,选择base64编码,后保存 *.cer 证书文件

    df4c8ba3ab1b

    df4c8ba3ab1b

    df4c8ba3ab1b

    一直下一步,保存证书文件,假如证书名叫test.cer。

    (2)假如是windows操作系统,cmd命令行切换成jdk的安装目录下的security,如D:\jdk1.7.0_80\jre\lib\security,security目录下有一个cacerts文件,然后执行以下命令,重新生成cacerts证书。

    keytool -import -v -file test.cer -storepass changeit -keystore cacerts

    展开全文
  • 记录Java发送HTTPS Get请求,其他请求方法类似。 import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.net.ssl.*; import java.io.ByteArrayOutputStream; import java.io.IOException; import...

    Java 调用 Https 请求(2021/05/11)

    更新时间 内容
    2021/03/03 自定义请求工具类实现
    2021/05/11 使用 Hutool 工具包实现

    1. 概述

    在日常开发中,有时会在程序中进行一些接口的调用,对于 Http 请求,可以使用 Apache 的 HttpClient 或者 Java 原生的 HttpURLConnection 来实现,但对于 Https 请求,由于需要对证书进行验证,无法直接进行请求。本文记录了一下在 Java 中调用 Https 请求的方法,便于后续使用。

    2. 实现

    2.1 HttpsURLConnection 实现

    该方法为笔者一开始查找资料自己封装的方法,不是特别完善;后来发现了 Hutool 工具包中封装了对 Https 请求的调用(关于 Hutool 工具包会在下文介绍),而且灵活度也比较高,因此推荐使用 Hutool 工具包。

    该方法通过 Java 原生的 HttpsURLConnection 来实现,优点为不需要依赖任何第三方包,缺点为需要自己实现编写较多代码。下面展示一下 GET 请求的实现,其他请求方法通过setRequestMethod 方法设置请求方法来实现,例如: httpsURLConnection.setRequestMethod("POST")

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import javax.net.ssl.*;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.security.SecureRandom;
    import java.security.cert.X509Certificate;
    
    /**
     * HTTPS请求工具类
     *
     * @author xiaoqqya
     * @version 2021/03/03
     */
    public class HttpsClientUtil {
    
        private static final Logger logger = LoggerFactory.getLogger(HttpsClientUtil.class);
    
        /**
         * 封装HTTPS GET请求
         *
         * @param urlStr 请求地址
         * @return 请求结果
         * @author xiaoqqya
         */
        public static byte[] httpsGet(String urlStr) {
            InputStream input;
            try {
                URL url = new URL(urlStr);
    
                boolean useHttps = urlStr.startsWith("https");
                if (useHttps) {
                    HttpsURLConnection httpsURLConnection = (HttpsURLConnection) url.openConnection();
                    HostnameVerifier ignoreHostnameVerifier = new MyHostnameVerifier();
                    SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
                    sslContext.init(null, new TrustManager[]{new MyX509TrustManager()}, new SecureRandom());
                    httpsURLConnection.setConnectTimeout(10000);
                    httpsURLConnection.setReadTimeout(20000);
                    httpsURLConnection.setHostnameVerifier(ignoreHostnameVerifier);
                    httpsURLConnection.setSSLSocketFactory(sslContext.getSocketFactory());
                    httpsURLConnection.connect();
                    input = httpsURLConnection.getInputStream();
                } else {
                    HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
                    httpURLConnection.setConnectTimeout(10000);
                    httpURLConnection.setReadTimeout(20000);
                    httpURLConnection.connect();
                    input = httpURLConnection.getInputStream();
                }
                return toByteArray(input);
            } catch (Exception e) {
                logger.error(e.getMessage(), e);
                return null;
            }
        }
    
        /**
         * 将输入流转换成字节数组
         *
         * @param input 输入流对象
         * @return 字节数组
         * @throws IOException IO异常
         * @author xiaoqqya
         */
        private static byte[] toByteArray(InputStream input) throws IOException {
            ByteArrayOutputStream output = new ByteArrayOutputStream();
            byte[] buffer = new byte[4096];
            int n;
            while (-1 != (n = input.read(buffer))) {
                output.write(buffer, 0, n);
            }
            return output.toByteArray();
        }
    }
    
    /**
     * 实现X509TrustManager接口,信任所有
     *
     * @author xiaoqqya
     * @version 2021/03/03
     */
    class MyX509TrustManager implements X509TrustManager {
    
        @Override
        public void checkClientTrusted(X509Certificate[] chain, String authType) {
    
        }
    
        @Override
        public void checkServerTrusted(X509Certificate[] chain, String authType) {
    
        }
    
        @Override
        public X509Certificate[] getAcceptedIssuers() {
            return new X509Certificate[0];
        }
    }
    
    /**
     * 实现HostnameVerifier接口,忽略HTTPS主机验证
     *
     * @author xiaoqqya
     * @version 2021/03/03
     */
    class MyHostnameVerifier implements HostnameVerifier {
    
        @Override
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    }
    
    2.2 Hutool 工具包实现

    Hutool 是一个小而全的 Java 工具类库,通过静态方法封装,降低相关 API 的学习成本,提高工作效率,使 Java 拥有函数式语言般的优雅,让 Java 语言也可以“甜甜的”。

    1. 导入 Maven 依赖

    如果你的项目不是一个 Maven 项目,那么请自行下载 Jar 包导入依赖。

    Hutool 提供了一个包含所有模块的 Jar 包 hutool-all ,也为每个子模块提供了单独的 Jar 包,例如此处用到的 Http 模块 hutool-http,在使用时二者导入一个即可,因为 Hutool 中还提供了很多其他的优秀工具类,所以笔者此处选择导入所有模块。

    <!-- hutool-all 为所有模块,hutool-http 为 Http 模块,使用时选择导入其中一个即可 -->
    
    <!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>5.6.5</version>
    </dependency>
    
    <!-- https://mvnrepository.com/artifact/cn.hutool/hutool-http -->
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-http</artifactId>
        <version>5.6.5</version>
    </dependency>
    

    2. 调用 Get、Post 请求

    针对常用的 Get、Post 请求,Hutool 在 HttpUtil 类中封装了两个方法。

    Get 请求例子:

    // 最简单的HTTP请求,可以自动通过header等信息判断编码,不区分HTTP和HTTPS
    String result1= HttpUtil.get("https://www.baidu.com");
    
    // 当无法识别页面编码的时候,可以自定义请求页面的编码
    String result2= HttpUtil.get("https://www.baidu.com", CharsetUtil.CHARSET_UTF_8);
    
    //可以单独传入http参数,这样参数会自动做URL编码,拼接在URL中
    HashMap<String, Object> paramMap = new HashMap<>();
    paramMap.put("city", "北京");
    
    String result3= HttpUtil.get("https://www.baidu.com", paramMap);
    

    Post 请求例子:

    HashMap<String, Object> paramMap = new HashMap<>();
    paramMap.put("city", "北京");
    
    String result= HttpUtil.post("https://www.baidu.com", paramMap);
    

    文件上传:

    HashMap<String, Object> paramMap = new HashMap<>();
    //文件上传只需将参数中的键指定(默认file),值设为文件对象即可,对于使用者来说,文件上传与普通表单提交并无区别
    paramMap.put("file", FileUtil.file("D:\\face.jpg"));
    
    String result= HttpUtil.post("https://www.baidu.com", paramMap);
    

    文件下载:

    String fileUrl = "http://mirrors.sohu.com/centos/7.3.1611/isos/x86_64/CentOS-7-x86_64-DVD-1611.iso";
    
    //将文件下载后保存在E盘,返回结果为下载文件大小
    long size = HttpUtil.downloadFile(fileUrl, FileUtil.file("e:/"));
    System.out.println("Download size: " + size);
    

    3. HttpRequest

    为了能够更加灵活的操作 Http 请求,Hutool 还提供了 HttpRequest类,使用该类可以通过链式很方便的指定请求头、表单等信息。

    Post 请求例子:

    //链式构建请求
    String result2 = HttpRequest.post(url)
        .header(Header.USER_AGENT, "Hutool http")//头信息,多个头信息多次调用此方法即可
        .form(paramMap)//表单内容
        .timeout(20000)//超时,毫秒
        .execute().body();
    

    通过 HttpRequest 类还可以设置一些验证信息等,具体可查阅 Hutool 官方文档。

    3. 总结

    通过 Java 原生的 HttpsURLConnection 来实现不需要依赖任何的第三方包,也比较灵活,但需要自己编写较多代码来实现,也容易出现异常;而通过 Hutool 工具包来实现,虽然需要导入第三方 Jar 包依赖,但方便灵活,稳定性也较好。因此,从笔者自己体验来看,推荐使用后者。

    相关链接:

    展开全文
  • HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全下面介绍一下java 代码如何调用https请求,这里使用的是httpclient 代码如下:import java.net.URI;import java.security.cert....

    https请求比http更安全 是在http的基础上加了SSL数据加密协议

    http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全

    下面介绍一下java 代码如何调用https请求,这里使用的是httpclient 代码如下:

    import java.net.URI;

    import java.security.cert.CertificateException;

    import java.security.cert.X509Certificate;

    import java.util.Map.Entry;

    import javax.net.ssl.SSLContext;

    import org.apache.http.HttpEntity;

    import org.apache.http.HttpResponse;

    import org.apache.http.HttpStatus;

    import org.apache.http.client.HttpClient;

    import org.apache.http.client.config.RequestConfig;

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

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

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

    import org.apache.http.client.utils.URIBuilder;

    import org.apache.http.conn.ssl.SSLConnectionSocketFactory;

    import org.apache.http.conn.ssl.SSLContextBuilder;

    import org.apache.http.conn.ssl.TrustStrategy;

    import org.apache.http.entity.mime.MultipartEntityBuilder;

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

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

    import org.apache.http.util.EntityUtils;

    public class HttpsclientTest {

    public static void main(String[] args) {

    try {

    SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {

    @Override

    public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {

    return true;

    }

    }).build();

    SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);

    HttpClient httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build();

    HttpPost httppost = new HttpPost("https://community.apache.org/contributors/");

    MultipartEntityBuilder mEntityBuilder = MultipartEntityBuilder.create();

    //params

    //mEntityBuilder.addTextBody("userName", "1234");

    httppost.setEntity(mEntityBuilder.build());

    //httppost.addHeader("Content-Type", "Application/JSON");

    int timeOut = 1000*50;

    // set Timeout

    RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(timeOut)

    .setConnectTimeout(timeOut).setSocketTimeout(timeOut).build();

    httppost.setConfig(requestConfig);

    // get responce

    HttpResponse responce = httpClient.execute(httppost);

    // get http status code

    int status = responce.getStatusLine().getStatusCode();

    System.out.println("request code:" + status);

    String resultString = null;

    if (status == HttpStatus.SC_OK) {

    // get result data

    HttpEntity entity = responce.getEntity();

    resultString = EntityUtils.toString(entity);

    }

    System.out.println(resultString);

    }

    catch (Exception e) {

    e.printStackTrace();

    }

    }

    }

    展开全文
  • 调用https的webService的时候几种常用的方法会出现安全错误,很多人说的是在jre里面装证书。。。那也太郁闷了吧这里提供一种不用证书的方式对方webService提供的接口,这个你应该要知道的吧,不知道的话就wsdl自己...

    java调webService太正常了。。。

    在调用https的webService的时候几种常用的方法会出现安全错误,很多人说的是在jre里面装证书。。。那也太郁闷了吧

    这里提供一种不用证书的方式

    对方webService提供的接口,这个你应该要知道的吧,不知道的话就wsdl自己还原

    Java代码

    /**

    * XXX的webService接口声明

    * 包括两个方法:

    * 1.根据XXX提供的license取得检查的xml模板

    * 2.根据XXX提供的license和包装好的xml模板,取得检查结果

    * @author bo

    * @version $Id: XXXInterface.java,v 0.1 2009-9-1 上午09:59:05 bo Exp $

    */

    public interface XXXInterface{

    // 核查方法

    public String xxxCheck(String inLicense, String inConditions);

    // 取得条件文件模板

    public String xxxGetCondition(String inLicense) throws Exception;

    }

    /**

    * XXX的webService接口声明

    * 包括两个方法:

    * 1.根据XXX提供的license取得检查的xml模板

    * 2.根据XXX提供的license和包装好的xml模板,取得检查结果

    * @author bo

    * @version $Id: XXXInterface.java,v 0.1 2009-9-1 上午09:59:05 bo Exp $

    */

    public interface XXXInterface{

    // 核查方法

    public String xxxCheck(String inLicense, String inConditions);

    // 取得条件文件模板

    public String xxxGetCondition(String inLicense) throws Exception;

    }

    Java代码

    /** xxxx网webService地址 */

    private static final String SERVICE_URL       = "https://api.xxx.org.cn/ws/services/";

    /** xxx网webService的名称空间 */

    private sta

    展开全文
  • import java.security.KeyManagementException; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.cert.CertificateException; import java....
  • 一般调用外部接口会需要用到http和https请求。一.发起http请求1.写http请求方法//处理http请求 requestUrl为请求地址 requestMethod请求方式,值为"GET"或"POST"public staticString httpRequest(String requestUrl,...
  • --调用项目提供接口,接口是用HTTP URL实现的,最初的想法是另一个项目用jQuerypost进行请求。---但是,很可能另一个项目是部署在别的机器上,那么就存在跨域问题,而jquery的post请求是不允许跨域的。---这时,就只...
  • 使用SSL/HTTPS协议来传输Web服务也可以使用SSL作为传输协议。虽然JAX-RPC并没有强制规定是否使用SSL协议,但在tomcat 下使用HTTPS协议。1、使用JDK自带的工具创建密匙库和信任库。1)通过使用以下的命令来创建服务器...
  • packagecom.inspur.demo....importjava.io.File;importjava.io.IOException;importjava.nio.CharBuffer;importjava.util.ArrayList;importjava.util.List;importjava.util.concurrent.CountDownLatch;impor...
  • 1.JAVA https请求 在做微信服务号的时候出现的问题,解决方法:自定义证书管理器。证书管理器的作用就是让它信任我们指定的证书,意味着信任所有证书,不管是否权威机构颁发,证书有了,通用的https请求方法就不...
  • python requests调用java接口(https请求,自签名证书校验) 背景 智能推荐项目中需要使用python调用java接口来调度执行Spark任务。 商用环境中,双方需使用https协议,及C/S端需要用SSL证书校验来保障接口安全...
  • java发送https请求与http请求的util

    千次阅读 2018-09-03 10:41:11
    post、get请求一般出现在前端调用后端接口的时候,现在如果希望java代码(非controller,controller调另一个controller可以redirect重定向)去调用controller接口,比如在job定时器中,达到某一条件需要返回给前端一条...
  • java调用curl请求对接接口

    千次阅读 2020-09-16 14:20:51
    1, 原curl调用post接口的命令 curl -H 'Content-Type:application/json' -X POST --data '{"accountNumber":"lihuan@psych.ac.cn","externalPlatForm":...2,java 调用curl命令 //java 调用 Curl的方法 publ.
  • 简介:使用URLConnection实现了调用http请求,该方法不支持调用https请求。https调用方式可查看:HttpURLConnection实现和HttpClient实现1.使用GET方式调用http请求代码: public static String requestHttpGet...
  • 简介:该工具类使用HttpURLConnection实现了调用http请求,同时支持调用https请求。1.实现及测试代码: import com.lenovo.m2.test.utils.StringUtil;import javax.net.ssl.*; import java.io.BufferedReader; ...
  • 简介:该工具类使用HttpClient实现...1.使用HttpClient实现调用http和https请求: import org.apache.http.Consts; import org.apache.http.HttpEntity; import org.apache.http.client.ClientProtocolException; impo
  • 一般调用外部接口会需要用到http和https请求。一.发起http请求1.写http请求方法//处理http请求 requestUrl为请求地址 requestMethod请求方式,值为"GET"或"POST"public staticString httpRequest(String requestUrl,...
  • 项目需要访问https请求但是一直报错No subject alternative names matching IP address XXX found.随查找各种API,原来https是双向握手,必须指定主机HttpsURLConnection conn = (HttpsURLConnection) url.open...
  • 通过观察日志中的错误信息发现,应该是在创建HttpConnection的http连接的时候,出现了SSL安全认证的问题,通过查找相关的资料发现,应该是由于外部接口的https证书中的主机名称与本地https请求的主机名称不一致导致...
  • 转自: https://blog.csdn.net/qq_27605885/article/details/79131483 本文来源是Apache官网例子:...
  • 本文来源是Apache官网例子:http://hc.apache.org/httpcomponents-client-4.5.x/httpclient/examples/org/apache/http/examples/client/ClientAuthentication.java 之前找过很多博客上的例子发现都不对,后来还是去...
  • 关于在Java调用REST接口,首先来说一下JAX-RS。JAX-RS是JAVA EE6 引入的一个新技术。JAX-RS即Java API for RESTful Web Services,是一个Java 编程语言的应用程序接口,支持按照表述性状态转移(REST)架构风格创建...
  • Java 调用Http和Https接口

    千次阅读 2019-08-09 16:44:21
    Java调用Http接口和Https接口 大多数我们调用的接口都是Http的,很少有Https的接口,近期做了个项目就用到和Https接口的请求调用,和大家分享一下心得。Http接口和Https接口主要是区别还是Https存在一个证书验证。...
  • 我在Kubernetes中设置了带有Ingress资源的Custom Nginx入口控制器,而不是“default-... 问题是当我请求规则中提到的主机名时,https重定向有效 . 但是,当进行规则中提到的主机以外的请求时,它会...
  • 2、后续扩展开发接口需要调用第三方系统的https接口,2020年3月上线时,该接口可以正常调用第三方的https接口服务;2020年6月第三方系统的证书过期了,后来更换了新的厂商的安全证书,导致原来的接口无法调用第三方...
  • URL myURL = new URL("https://ebanks.gdb.com.cn/sperbank/perbankLogin.jsp"); // 创建HttpsURLConnection对象,并设置其SSLSocketFactory对象 HttpsURLConnection httpsConn = (HttpsURLConnection) myURL....
  • 一般调用外部接口会需要用到http和https请求。 本案例为:前后端完全分离,前端框架(React+Mobx+Nornj),后端(Go语言)。 面临问题:跨域问题。(线上允许跨域访问) 解决方案:java发起https请求代理。(起到...
  • JAVA通过HTTPS发送POST请求的方法

    千次阅读 2018-05-08 19:04:20
    因为调用一个外部接口,会用到POST请求,而且还是Https的,但是由于之前学习的时候没有用到,所以研究了很久才弄懂了怎么去用JAVA实现Https发送post请求 使用的是HttpsURLConnection来操作的 代码如下 ...
  • Spring Cloud Sleuth 是分布式系统中跟踪服务间调用的工具,它可以直观地展示出一次请求调用过程,本文将对其用法进行详细介绍。Spring Cloud Sleuth 简介 随着我们的系统越来越庞大,各个服务间的调用关系也变得...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 805
精华内容 322
关键字:

java调用https请求

java 订阅