RestTemplate 请求https接口,无需证书访问,并整合工具类,细到极致

这篇具有很好参考价值的文章主要介绍了RestTemplate 请求https接口,无需证书访问,并整合工具类,细到极致。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  Hello,大家好呀,我是你们的Jessica老哥,不知不觉,到了3月份了,又是一年一度的金三银四,老哥和大家一样,想换工作,于是呢,更新资料,投简历。试想着把自己的劳动价值卖的更高一点。
  没想到,今年好像行情有点不太对劲呀,往年跟HR打个招呼,人家还会要你简历,可现在呢,人家是已读不回,硬气了。也许是老哥的学历低,再加上大环境不好和学编程的人越来越多,不好找工作咯。算了,算了,老哥继续苟着吧。

这次给大家带来的是 RestTemplate 请求https接口,我们都知道,https接口一般是需要证书才能访问的,但是我们可以采取一些特殊的手段,跳过证书验证。下面,老哥讲下具体的代码

1、首先,配置一个 RestTemplate的bean,说明:RestTemplate是spring-web自带的,我们不需要额外引入什么包

@Configuration
public class RestTemplateConfig {

 /**
     * 构建支持忽略自签名证书的Restemplate的bean
     * @return 支持发起https请求的RestTemplate对象
     * @throws KeyStoreException 证书异常
     * @throws NoSuchAlgorithmException 加密算法不可用异常
     * @throws KeyManagementException 密钥管理异常
     */
    @Bean("httpsTemplate")
    public RestTemplate createHttpsRestTemplate()
            throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
        TrustStrategy acceptingTrustStrategy = (x509Certificates, authType) -> true;
        SSLContext sslContext = SSLContexts.custom()
                .loadTrustMaterial(null, acceptingTrustStrategy)
                .build();
        SSLConnectionSocketFactory sslFactory = new SSLConnectionSocketFactory(
                sslContext, new NoopHostnameVerifier());

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

        HttpComponentsClientHttpRequestFactory factory =
                new HttpComponentsClientHttpRequestFactory();
        factory.setConnectTimeout(3600000);
        factory.setReadTimeout(3600000);

        factory.setHttpClient(httpClient);

        return new RestTemplate(factory);
    }

}

2、然后,配置一下 RestTemplate 工具类

@Slf4j
@Component
public class RestTemplateUtil {
    private static RestTemplate restTemplate;

    @Autowired
    private RestTemplate httpsTemplate;

    @PostConstruct
    public void afterPropertiesSet() {
        RestTemplateUtil.restTemplate = httpsTemplate;
    }

    /**
     * Get 请求 不带参数 没有请求头 没有请求参数 没有请求体
     * @param url
     * @return
     */
    public static String sendSimple(String url) {
        return sendSimple(url, null, HttpMethod.GET, null,new HttpHeaders());
    }

    /**
     * Get 请求 url带请求参数
     * @param url
     * @param urlParam
     * @return
     */
    public static String sendSimple(String url, Map<String, ?> urlParam) {
        return sendSimple(url, urlParam, HttpMethod.GET);
    }

    /**
     * Get 请求 url带请求参数 请求头携带参数
     * @param url
     * @param urlParam
     * @param headers
     * @return
     */
    public static String sendSimple(String url, Map<String, ?> urlParam, HttpHeaders headers) {
        return sendSimple(url, urlParam, HttpMethod.GET,null, headers);
    }

    public static String sendSimple(String url, Map<String, ?> urlParam, HttpMethod method) {
        return sendSimple(url, urlParam, method, null,new HttpHeaders());
    }

    /**
     * Get发送简单请求,不含body
     *
     * @param url      url
     * @param urlParam 用?和&拼接在url后面的参数
     * @param method   请求方式
     * @param headers  请求头
     * @return body
     */
    public static String sendSimple(String url, Map<String, ?> urlParam, HttpMethod method, Map<String, ?> header,HttpHeaders headers) {
        if (urlParam == null) {
            urlParam = new HashMap<>(0);
        }
        // url参数拼接
        url = handleUrlParam(url, urlParam);

        //填充属性到请求头
        fillParamsToHttpHeader(header,headers);

        HttpEntity<MultiValueMap<String, ?>> requestEntity = new HttpEntity<>(null, headers);

        log.info("请求地址为: "+url);

        return restTemplate.exchange(url, method, requestEntity, String.class, urlParam).getBody();
    }

    /**
     * 表单提交,没有请求头和url拼接,有请求体
     * @param url
     * @param body
     * @return
     */
    public static String sendForm(String url, Map<String, Object> body) {
        return sendForm(url, null, body, HttpMethod.POST, new HttpHeaders());
    }

    /**
     * 表单提交,有url拼接和请求体
     * @param url
     * @param body
     * @return
     */
    public static String sendForm(String url, Map<String, ?> urlParam, Map<String, Object> body) {
        return sendForm(url, urlParam, body, HttpMethod.POST, new HttpHeaders());
    }

    /**
     * 表单提交,有url拼接和请求头、请求体
     * @param url
     * @param urlParam
     * @param header
     * @param body
     * @return
     */
    public static String sendForm(String url, Map<String, ?> urlParam,Map<String, ?> header, Map<String, Object> body) {
        return sendForm(url, urlParam, body, HttpMethod.POST, new HttpHeaders());
    }

    /**
     * 表单提交,有请求头和请求体 指定请求方式
     * @param url
     * @param urlParam
     * @param body
     * @param method
     * @return
     */
    public static String sendForm(String url, Map<String, ?> urlParam, Map<String, Object> body, HttpMethod method) {
        return sendForm(url, urlParam, body, method, new HttpHeaders());
    }

    public static String sendForm(String url,Map<String, ?> header, Map<String, Object> body,
                                  HttpMethod method, HttpHeaders headers) {
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        return send(url, header, body, method, headers,null);
    }

    public static String sendForm(String url, Map<String, ?> header,Map<String, Object> body,
                                  HttpMethod method, HttpHeaders headers, Map<String, ?> urlParam) {
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        return send(url, header,body, method, headers,urlParam);
    }

    public static String sendJson(String url, Map<String, Object> body) {
        return sendJson(url, null, body, HttpMethod.POST, new HttpHeaders());
    }

    public static String sendJson(String url, Map<String, ?> urlParam, Map<String, Object> body) {
        return sendJson(url, urlParam, body, HttpMethod.POST, new HttpHeaders());
    }

    public static String sendJson(String url, Map<String, ?> head, Map<String, Object> body, HttpMethod method,Map<String, ?> urlParam) {
        return sendJson(url, head, body, method, new HttpHeaders(),urlParam);
    }

    public static String sendJson(String url, Map<String, ?> head, Map<String, Object> body,
                                  HttpMethod method, HttpHeaders headers,Map<String, ?> urlParam) {
        headers.setContentType(MediaType.APPLICATION_JSON);
        return send(url, head, body, method, headers,urlParam);
    }

    /**
     * 复杂请求发送
     *
     * @param url      url
     * @param head     请求头
     * @param body     请求体
     * @param method   请求方式
     * @param headers  实际请求头
     * @param urlParam 用?和&拼接在url后面的参数
     *
     */
    public static String send(String url, Map<String, ?> head,Map<String, Object> body, HttpMethod method,
                              HttpHeaders headers, Map<String, ?> urlParam) {
        try {
            if (urlParam == null) {
                urlParam = new HashMap<>(16);
            }
            // Get 请求 url参数拼接
            if (method.equals(HttpMethod.GET)){
                url = handleUrlParam(url, urlParam);
            }

            //填充参数到Http请求头
            fillParamsToHttpHeader(head,headers);

            log.info("请求地址为: "+url);

            if (Objects.equals(headers.getContentType(), MediaType.APPLICATION_JSON)) {
                String str=null;
                if (Objects.isNull(body)){
                    str=new JSONObject().toJSONString();
                }else {
                    JSONObject jsonObject = new JSONObject();
                    jsonObject.putAll(body);
                    str=jsonObject.toJSONString();
                }
                HttpEntity<String> requestEntity = new HttpEntity<>(str,headers);
                return restTemplate.postForEntity(url,requestEntity,String.class).getBody();
            }
            if (Objects.equals(headers.getContentType(), MediaType.APPLICATION_FORM_URLENCODED)) {
                // body参数处理
                MultiValueMap<String,String> param =new LinkedMultiValueMap<>();
                for (Map.Entry<String, ?> next : body.entrySet()) {
                    param.add(next.getKey(), (String) next.getValue());
                }

                HttpEntity <MultiValueMap<String,String>>  requestEntity = new HttpEntity<>(param, headers);
                return restTemplate.exchange(url, method, requestEntity, String.class, urlParam).getBody();
            }
        }catch (Exception e){
            log.error(e.getMessage());
            e.printStackTrace();
        }
        return null;
    }

    /**
     * url参数拼接
     *
     * @param url
     * @param urlParam
     * @return
     */
    private static String handleUrlParam(String url, Map<String, ?> urlParam) {
        if (urlParam == null || urlParam.isEmpty()) {
            return url;
        }
        Iterator<? extends Map.Entry<String, ?>> iterator = urlParam.entrySet().iterator();
        StringBuilder urlBuilder = new StringBuilder(url);
        urlBuilder.append("?");
        while (iterator.hasNext()) {
            Map.Entry<String, ?> entry = iterator.next();
            urlBuilder.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
        }
        urlBuilder.deleteCharAt(urlBuilder.length() - 1);
        return String.valueOf(urlBuilder);
    }

    /**
     * 填充参数到请求头
     *
     * @param heads
     * @param headers
     */
    public static void fillParamsToHttpHeader(Map<String,?> heads, HttpHeaders headers) {
        if (!Objects.isNull(heads)) {
            Set<String> keySet = heads.keySet();
            for (String s : keySet) {
                headers.add(s,String.valueOf(heads.get(s)));
            }
        }
    }


}

3、使用,只需要按照下面的模板,传递参数即可

   public static void main(String[] args) {
        //分别填入请求头和请求体参数即可
        Map<String, Object> headerMap = new ConcurrentHashMap<>(16);
        Map<String, Object> bodyMap = new ConcurrentHashMap<>(16);

        String url = String.format("https://%s/test", "你的主机地址");
        String jsonStr = RestTemplateUtil.sendForm(url, headerMap, bodyMap);
        User user = JSONObject.parseObject(jsonStr, User.class);
        System.out.println(user);
    }

3A、最后,各位小伙伴,麻烦给老哥一个点赞、关注、收藏三连好吗,你的支持是老哥更新最大的动力,谢谢!文章来源地址https://www.toymoban.com/news/detail-718759.html

到了这里,关于RestTemplate 请求https接口,无需证书访问,并整合工具类,细到极致的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot整合自签名SSL证书,转变HTTPS安全访问(单向认证服务端)

    HTTP 具有相当优秀和方便的一面,然而 HTTP 并非只有好的一面,事物皆具两面性,它也是有不足之处的。例如: 通信使用明文(不加密),内容可能会被窃听。 不验证通信方的身份,因此有可能会遭遇伪装。 无法证明报文的完整性,所以有可能会遭篡改等。 因HTTP有存在通信

    2024年02月06日
    浏览(47)
  • restTemplate转发Https请求

    代码架构 效果

    2024年02月08日
    浏览(28)
  • 解锁新技能RestTemplate设置全局、单个请求超时时间及支持https请求

    springboot请求第三方接口时会用到RestTemplate,其底层实现逻辑默认是通过SimpleClientHttpRequestFactory来实现,具体由socket连接来实现;可以替换其默认实现为HttpComponentsClientHttpRequestFactory。 一、自定义RestTemplate实例对象 二、RestTemplate自定义全局超时时间 三、RestTemplate设置单个请求

    2023年04月09日
    浏览(30)
  • SpringBoot 使用RestTemplate来调用https接口

    使用RestTemplate来访问第三方https接口,接口类型为POST,返回数据为JSON,需要忽略https证书,因此对RestTemplate 进行配置,通过HttpClient的请求工厂(HttpComponentsClientHttpRequestFactory)进行构建。HttpComponentsClientHttpRequestFactory使用一个信任所有站点的HttpClient就可以解决问题了。 中间

    2024年02月13日
    浏览(41)
  • Java工具类:使用RestTemplate请求WebService接口

    对接第三方提供的 WebService 接口,早期的调用方式过于复杂繁琐,所以使用 RestTemplate 进行调用 注:除了 RestTemplate 之外, HttpURLConnection 等也可以用来调用webservice接口 如果需要将xml转为Json,可参考:

    2024年01月22日
    浏览(47)
  • RestTemplate发起HTTPS请求Unsupported or unrecognized SSL message 报错解决

    原因:RestTemplate默认是不支持HTTPS请求的,那么如果想使用RestTemplate发送一个HTTPS的请求 ,就需要对证书进行处理,这里记录一下一个可行的方法忽略证书的校验。 使用 RestTemplateBuilder 来构建一个 RestTemplate ,而非使用默认。 requestFactory() 方法用来设置 ClientHttpRequestFactory 。

    2024年02月11日
    浏览(32)
  • HTTPS请求忽略SSL证书

    现场环境: 后端服务部署在docker内,远程调用https接口,线上报错: unable to find valid certification path to requested target 解决方案: 设置SSLSocketFactory忽略证书校验 实现案例: 使用的cn.hutool.http.HttpRequest工具类请求的数据,支持设置头部、表单、body、超时时间等关键信息 工具类 SSL

    2024年02月11日
    浏览(43)
  • http请求https忽略证书验证

    2024年02月02日
    浏览(47)
  • 万字长文讲解调用第三方接口,RestTemplate,urlConnection使用详解,java代码模拟postman发送请求

    业务场景 :在日常开发中,经常需要调用第三方接口,例如调用物流接口,此时需要利用urlConnection或者restTemplate模拟postman发送请求,请求支持加header ,设置content-type支持传递json;请求方式get,post,也可以需要传递文件,或者传递文件流; 下面这个例子就包含日常开发中大

    2024年02月05日
    浏览(49)
  • Tomcat配置https(jks证书请求)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 上一篇文章已经提到tomcat的pfx证书请求和开启https的做法 链接https://blog.csdn.net/qq_46153140/article/details/123344395?spm=1001.2014.3001.5501 这篇文章则是tomcat的jks的生成 生成思路: key+csr=crt;crt+key = pfx;pfx+key=jks 

    2024年02月16日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包