OkHttpClient 发送https请求

1 引包

<dependency>
			<groupId>com.squareup.okhttp3</groupId>
			<artifactId>okhttp</artifactId>
			<version>3.9.0</version>
		</dependency>

		<dependency>
			<groupId>com.google.code.gson</groupId>
			<artifactId>gson</artifactId>
			<version>2.8.5</version>
		</dependency>

2 配置

package com.neusoft.aclome.cmp.resource.server.config;

import okhttp3.OkHttpClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.net.ssl.*;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.util.concurrent.TimeUnit;

/**
 * Bean
 *
 * @author
 */
@Configuration
public class OkHttpClientConfig {

    @Bean
    public OkHttpClient getOkHttpClient(){
        return  buildOKHttpClient()
                .retryOnConnectionFailure(true) // 当连接失败,尝试重连
                .connectTimeout(600, TimeUnit.SECONDS)
                .readTimeout(600, TimeUnit.SECONDS)
                .writeTimeout(600, TimeUnit.SECONDS)
                .build();
    }


    /**
     * 发送https请求
     * @return
     */
    private OkHttpClient.Builder buildOKHttpClient() {
        try {
            TrustManager[] trustAllCerts = buildTrustManagers();
            final SSLContext sslContext = SSLContext.getInstance("SSL");//SSL
            //System.setProperty("https.protocols", "TLSv1.2,TLSv1.1,SSLv3");
            sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
            final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
            OkHttpClient.Builder builder = new OkHttpClient.Builder();
            builder.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0]);
            builder.hostnameVerifier((hostname, session) -> true);
            return builder;
        } catch (NoSuchAlgorithmException | KeyManagementException e) {
            e.printStackTrace();
            return new OkHttpClient.Builder();
        }
    }

    private static TrustManager[] buildTrustManagers() {
        return new TrustManager[]{
                new X509TrustManager() {
                    @Override
                    public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) {
                    }

                    @Override
                    public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) {
                    }

                    @Override
                    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                        return new java.security.cert.X509Certificate[]{};
                    }
                }
        };
    }

}

3、bean

package com.neusoft.aclome.cmp.resource.server.model.entity.enums.H3C;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;

/**
 * @author zc
 * date 2020-06-10
 * @description
 */
public enum RequestType {
    POST,
    PATCH,
    DELETE,
    GET;
    @JsonCreator
    public static RequestType value(String v) {
        if (v == null) {
            return POST;
        }
        try {
            return valueOf(v.toUpperCase());
        } catch (IllegalArgumentException e) {
            return POST;
        }
    }

    @JsonValue
    public String value() {
        return name().toLowerCase();
    }
}
package com.neusoft.aclome.cmp.resource.server.model.entity.bean.H3C;

import lombok.Data;

/**
 * @author zc
 * date 2021-08-17
 * @description
 */
@Data
public class TokenBean {

    /**
     * 登录成功时返回
     * •	admin:管理员
     * •	normal:普通用户
     */
    private String userType;

    /**
     * 登录失败时返回的错误原因(中文转义字符)
     */
    private String message;

    /**
     * 登录失败时返回的错误码,有以下几种错误:
     * •	USERNAME_OR_PASSWORD_ERROR:用户名或密码错误
     * •	INTERNAL_SERVER_ERROR:服务器内部错误
     * •	LICENSE_VALIDATE_ERROR:License校验失败
     * •	LICENSE_EXPIRE_ERROR:License已经过期
     */
    private String errorcode;

    /**
     * calamari_sessionid 发请求时header 使用
     */
    private String calamariSessionid;

    /**
     * XSRF-TOKEN 发请求时header 使用
     */
    private String XSRFTOKEN;
}

4、请求

package com.neusoft.aclome.cmp.resource.server.util;

import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
import com.neusoft.aclome.cmp.resource.server.model.entity.bean.H3C.TokenBean;
import com.neusoft.aclome.cmp.resource.server.model.entity.enums.H3C.RequestType;
import lombok.extern.slf4j.Slf4j;
import okhttp3.*;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;

import java.util.List;


/**
 * @author zc
 * date 2021-08-17
 * @description
 */
@Slf4j
@Component
public class H3CHttpUtil {

    /**
     * 通用请求 json格式
     * @param okHttpClient
     * @param url
     * @param requestType
     * @param mapper
     * @param object
     * @return
     */
    public JSONObject request(OkHttpClient okHttpClient, String url, RequestType requestType, ObjectMapper mapper, Object object, Headers headers) {
        JSONObject jsonObject = null;
        try {
            String requestBody = new Gson().toJson(object);
            log.info("------ 请求路径:{} ------", url);
            log.info("------ 请求体参数:{} ------", requestBody);
            log.info("------ 请求体类型:{} ------", requestType.name());
            RequestBody body = RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"), requestBody);
            Request request = null;
            switch (requestType) {
                case POST:
                    request = new Request.
                            Builder().
                            url(url).
                            headers(headers).
                            post(body).
                            build();
                    break;
                case PATCH:
                    request = new Request.
                            Builder().
                            url(url).
                            headers(headers).
                            patch(body).
                            build();
                    break;
                case GET:
                    request = new Request.
                            Builder().
                            url(url).
                            headers(headers).
                            get().
                            build();
                    break;
                case DELETE:
                    request = new Request.
                            Builder().
                            url(url).
                            headers(headers).
                            delete().
                            build();
                    break;
            }
            Response response = okHttpClient.newCall(request).execute();
            if (response.isSuccessful()) {
                String responseStr = response.body().string();
                log.info("------ 返回内容:{} ------", responseStr);
                jsonObject = mapper.readValue(responseStr, JSONObject.class);
            } else {
                log.error("!!!!!! 发送请求时失败 Unexpected code:{} !!!!!!",  response);
            }
        } catch (Exception e) {
            log.error("!!!!!! 请求失败 异常:{} !!!!!!", e.getMessage());
        }
        return jsonObject;
    }

    public TokenBean token(OkHttpClient okHttpClient, String url, Object object) {
        TokenBean authTokenDto = null;
        try {
            String requestBody = new Gson().toJson(object);
            log.info("------ <token>请求路径: {} ------", url);
            log.info("------ <token>请求体参数: {} ------",  requestBody);
            log.info("------ <token>请求体类型: POST ------");
            RequestBody body = RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"), requestBody);
            Request request = new Request.Builder().
                            url(url).
                            header("Content-Type","application/json;charset=UTF-8").
                            header("Accept","application/json").
                            post(body).
                            build();
            Response response = okHttpClient.newCall(request).execute();
            if (response.isSuccessful()) {
                Headers headersResult = response.headers();
                if(headersResult != null){
                    List<String> list =  headersResult.values("Set-Cookie");
                    if(list != null && list.size()>0){
                        log.info("------ <token>header 返回内容:{} ------", list.toString());
                        authTokenDto = new TokenBean();
                        for(String content: list){
                            if(content.contains("calamari_sessionid")){
                                authTokenDto.setCalamariSessionid(content.replace("calamari_sessionid=",""));
                            }
                            if(content.contains("XSRF-TOKEN")){
                                authTokenDto.setXSRFTOKEN(content.replace("XSRF-TOKEN=","").split(";")[0]);
                            }
                        }
                        if (StringUtils.isNotBlank(authTokenDto.getCalamariSessionid()) && StringUtils.isNotBlank(authTokenDto.getXSRFTOKEN())) {
                            log.info("------ 获取<token>成功, 返回内容:{} ------", authTokenDto);
                        } else {
                            log.error("!!!!!! 获取<token>,失败 !!!!!!");
                        }
                    }

                }
            } else {
                log.error("!!!!!! 获取<token>,发送请求时失败 Unexpected code:{} !!!!!!", response);
            }
        } catch (Exception e) {
            log.error("!!!!!! 获取<token>,失败 异常:{} !!!!!!", e.getMessage());
        }
        return authTokenDto;
    }

    /**
     * 获取h3c header
     * @param token
     * @return
     */
    public Headers getHeaders(TokenBean token, String uri){
        Headers headers = new Headers.Builder().
                add("X-XSRF-TOKEN", token.getXSRFTOKEN()).
                add("Cookie", "calamari_sessionid=" + token.getCalamariSessionid() + ";" + "XSRF-TOKEN=" + token.getXSRFTOKEN()).
                add("Referer", uri + "/dsm/" ).
                add("Host",uri.replace("https://","")).
                build();
        log.info("--- 生成header内容:{} ---", headers.toString());
        return headers;
    }



}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值