目录
然后在当前okhttp配置类中设置好调用post请求的方法。
创建一个controller,用于外部调用,用于在内部使用okHttp发送get请求。
创建一个OKHttp类,用于配置Okhttp,在这里配置的只能调用以http开头的请求
配置okhttp的内容为:
@Slf4j
@Component
@Scope("prototype")
public class EasyHttpClient {
public final OkHttpClient httpClient;
/**
* 连接超时时间 单位秒(默认10s)
*/
private static final int CONNECT_TIMEOUT = 10;
/**
* 写超时时间 单位秒(默认 0 , 不超时)
*/
private static final int WRITE_TIMEOUT = 0;
/**
* 回复超时时间 单位秒(默认30s)
*/
private static final int READ_TIMEOUT = 120;
/**
* 底层HTTP库所有的并发执行的请求数量
*/
private static final int DISPATCHER_MAX_REQUESTS = 32;
/**
* 底层HTTP库对每个独立的Host进行并发请求的数量
*/
private static final int DISPATCHER_MAX_REQUESTS_PER_HOST = 8;
/**
* 底层HTTP库中复用连接对象的最大空闲数量
*/
private static final int CONNECTION_POOL_MAX_IDLE_COUNT = 16;
/**
* 底层HTTP库中复用连接对象的回收周期(单位分钟)
*/
private static final int CONNECTION_POOL_MAX_IDLE_MINUTES = 5;
/**
* 初始化默认连接池
*/
private static final ConnectionPool DEFAULT_CONNETCTION_POOL = new ConnectionPool(CONNECTION_POOL_MAX_IDLE_COUNT, CONNECTION_POOL_MAX_IDLE_MINUTES, TimeUnit.MINUTES);
public static final String CONTENT_TYPE_KEY = "content-type";
public static final String CONTENT_TYPE_KEY_TMP = "Content-Type";
public static final String CONTENT_TYPE_JSON = "application/json; charset=UTF-8";
public static final String CONTENT_TYPE_JSON_TMP = "application/json";
public static final String CONTENT_TYPE_W3FORM = "application/x-www-form-urlencoded";
/**
* 构建一个默认配置的 HTTP Client 类
*/
public EasyHttpClient() {
this(
CONNECT_TIMEOUT,
READ_TIMEOUT,
WRITE_TIMEOUT,
DISPATCHER_MAX_REQUESTS,
DISPATCHER_MAX_REQUESTS_PER_HOST,
DEFAULT_CONNETCTION_POOL
);
}
/**
* 构建一个自定义配置的 HTTP Client 类
*/
public EasyHttpClient(int connTimeout, int readTimeout, int writeTimeout, int dispatcherMaxRequests,
int dispatcherMaxRequestsPerHost, ConnectionPool connectionPool) {
Dispatcher dispatcher = new Dispatcher();
dispatcher.setMaxRequests(dispatcherMaxRequests);
dispatcher.setMaxRequestsPerHost(dispatcherMaxRequestsPerHost);
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.dispatcher(dispatcher);
builder.connectionPool(connectionPool);
builder.connectTimeout(connTimeout, TimeUnit.SECONDS);
builder.readTimeout(readTimeout, TimeUnit.SECONDS);
builder.writeTimeout(writeTimeout, TimeUnit.SECONDS);
// 配置https
// builder.sslSocketFactory(createSSLSocketFactory(), SSLSocketClient.getX509TrustManager());
// builder.hostnameVerifier((s, sslSession) -> true);
httpClient = builder
.build();
}
}
上面配置okHttpClient的时候配置了访问https,如果不访问https,就可以不用配置
然后在当前okhttp配置类中设置好调用get请求的方法。
此代码就是写在上面的EasyOKClient类中的。
/**
* get
*/
public <T> T get(String url, Map<String, Object> queryParams, Map<String, Object> headers, Class<T> clazz) {
log.info("EasyOKClient请求地址:{}", url);
log.info("EasyOKClient请求参数:{}", queryParams);
log.info("EasyOKClient请求头:{}", headers);
HttpUrl.Builder httpBuilder = Objects.requireNonNull(HttpUrl.parse(url)).newBuilder();
// 设置参数
Optional.ofNullable(queryParams)
.ifPresent(its -> its.forEach((key, value) -> httpBuilder.addQueryParameter(key, value.toString())));
// 创建请求
Request.Builder requestBuilder = new Request.Builder().get().url(httpBuilder.build());
return JSON.parseObject(send(requestBuilder, headers), clazz);
}
private String send(Request.Builder requestBuilder, Map<String, Object> headers) {
Response response;
try {
Optional.ofNullable(headers)
.ifPresent(its -> its.forEach((key, value) -> requestBuilder.header(key, value.toString())));
response = httpClient.newCall(requestBuilder.build()).execute();
} catch (Exception ex) {
ex.printStackTrace();
log.info("调用远程接口失败," + ex.getMessage());
throw new RuntimeException("调用远程接口【" + requestBuilder.build().url().toString() + "】失败", ex);
}
try {
assert response.body() != null;
String responseStr = response.body().string();
log.info("EasyOKClient请求返回值:{}", responseStr);
return responseStr;
} catch (Exception e) {
log.info("发送请求成功,但是请求数据失败。");
throw new RuntimeException("请求接口【" + requestBuilder.build().url() + "】失败", e);
}
}
return JSON.parseObject(send(requestBuilder, headers), clazz);
这一段的代码是对okhttp请求得到的json字符串进行转换为对象。clazz就代表要转换的对象
然后在当前okhttp配置类中设置好调用post请求的方法。
此代码就是写在上面的EasyOKClient类中的。
public <T> T post(String url, RequestBody body, Map<String, Object> headers, Class<T> clazz) {
HttpUrl.Builder httpBuilder = Objects.requireNonNull(HttpUrl.parse(url)).newBuilder();
Request.Builder requestBuilder = new Request.Builder().post(body).url(httpBuilder.build());
return JSON.parseObject(send(requestBuilder, headers), clazz);
}
private String send(Request.Builder requestBuilder, Map<String, Object> headers) {
Response response;
try {
Optional.ofNullable(headers)
.ifPresent(its -> its.forEach((key, value) -> requestBuilder.header(key, value.toString())));
response = httpClient.newCall(requestBuilder.build()).execute();
} catch (Exception ex) {
throw new RuntimeException("调用远程接口【" + requestBuilder.build().url().toString() + "】失败", ex);
}
try {
assert response.body() != null;
String responseStr = response.body().string();
log.info("EasyOKClient请求返回值:{}", responseStr);
return responseStr;
} catch (Exception e) {
throw new RuntimeException("请求接口【" + requestBuilder.build().url() + "】失败", e);
}
}
案例演示:
使用OkHttp发送get请求,我们当前调用的三方接口需要cookie,就要请求头中设置cookie。
新建一个类Util,用于发送get请求。
@Slf4j
@Component
public class BdpClient {
@Autowired
private EasyOKClient client;
public Optional<JoifUcApiResult> callUcGet(String ucIp,String apiUrl, Map<String, Object> params, boolean takeCookie) {
Map<String, Object> headers = Maps.newHashMap();
if (takeCookie) {
headers.put("Cookie", " access_token=" + ThreadLocalToken.get() + ";my_user_id=" + ThreadLocalUserId.get());
}
JoifUcApiResult ucApiResult = client.get(ucIp + apiUrl, params, headers, JoifUcApiResult.class);
//Optional.ofNullable 用于判断传入的参数是否为空
return Optional.ofNullable(ucApiResult);
}
}
创建一个controller,用于外部调用,用于在内部使用okHttp发送get请求。
@PostMapping("/addJob")
public BaseResponse addJob(@RequestBody JobDataBo job){
jobService.addJob(job);
return new BaseResponse();
}
然后创建Service,用来发送get请求
public void addJob(JobDataBo job) {
//调用第三方接口,得到第三方的导出表名称。
List<JobListBo> saveJobList = job.getSave_job_list();
for (JobListBo jobListBo : saveJobList) {
JoifUcApiResult joifUcApiResult = bdpUtil.getJobTsName(jobListBo.getTb_id(),"STANDARD"
,job.getDmc_request(),job.getSys_pro_name());
log.info("从dmc提供的第三方接口得到的数据为:" + joifUcApiResult.getResult().toString());
}
}
这就是使用okhttp发送请求的过程。