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