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、最后,各位小伙伴,麻烦给老哥一个点赞、关注、收藏三连好吗,你的支持是老哥更新最大的动力,谢谢!

  • 11
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
Java 调用第三方接口通常会使用工具类 RestTemplateRestTemplate 是 Spring 框架提供的一个用于进行 HTTP 请求工具类。它封装了 HTTP 请求的细节,提供了简单的 API 来发送 GET、POST、PUT 和 DELETE 请求,并能够方便地处理返回的响应结果。 使用 RestTemplate 需要先导入相关的依赖包,然后在代码中创建 RestTemplate 的实例。可以通过 RestTemplate 的各种方法来构建不同类型的 HTTP 请求,比如 getForObject、postForObject 等。在方法的参数中需要指定目标接口的 URL 地址,以及可能需要传递的请求参数。 在调用三方接口时,有时需要进行身份验证,可以在请求头中添加认证信息。RestTemplate 的方法中可以通过 HttpHeaders 对象来设置请求头的相关信息。另外,还可以设置请求体的内容格式,比如 JSON、XML 等。 调用接口后,可以通过 RestTemplate 的方法获取响应结果。比如,getForObject 和 postForObject 方法会返回代表响应结果的对象(可以是字符串、对象等)。另外,还可以通过 getForEntity 和 postForEntity 方法获取完整的响应对象,包括响应头、响应体等信息。 在使用 RestTemplate 调用接口时需要注意异常处理。如果调用接口出现异常,可以通过捕获 RestTemplateException 异常来处理。另外,还可以通过设置错误处理器来处理不同类型的错误响应。 总之,RestTemplate 是一个非常实用的工具类,可以方便地进行 Java 对第三方接口的调用。通过它,我们可以发送 HTTP 请求,处理响应结果,并且简化了请求的编写和异常处理的过程。使用 RestTemplate 可以提高开发效率,并且可以与不同的第三方接口进行灵活的集成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jesscia ^_^

您的打赏将是我努力的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值