package com.lp.util;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import okhttp3.*;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.springframework.stereotype.Component;
import java.io.File;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
@Slf4j
@Component
public class OkHttpUtil {
private static volatile OkHttpClient okHttpClient;
private final static int READ_TIMEOUT = 100;
private final static int CONNECT_TIMEOUT = 60;
private final static int WRITE_TIMEOUT = 60;
private OkHttpUtil() {
okhttp3.OkHttpClient.Builder clientBuilder = new okhttp3.OkHttpClient.Builder();
//读取超时
clientBuilder.readTimeout(READ_TIMEOUT, TimeUnit.SECONDS);
//连接超时
clientBuilder.connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS);
//写入超时
clientBuilder.writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS);
//自定义连接池最大空闲连接数和等待时间大小,否则默认最大5个空闲连接
clientBuilder.connectionPool(new ConnectionPool(32, 5, TimeUnit.MINUTES));
okHttpClient = clientBuilder.build();
}
public static OkHttpClient getInstance() {
if (null == okHttpClient) {
synchronized (OkHttpUtil.class) {
if (okHttpClient == null) {
new OkHttpUtil();
return okHttpClient;
}
}
}
return okHttpClient;
}
/**
* get
*
* @param url 请求的url
* @param queries 请求的参数,在浏览器?后面的数据,没有可以传null
* @return
*/
public String get(String url, Map<String, String> queries) {
String responseBody = "";
StringBuilder sb = new StringBuilder(url);
if (queries != null && queries.keySet().size() > 0) {
boolean firstFlag = true;
for (Map.Entry<String, String> entry : queries.entrySet()) {
if (firstFlag) {
sb.append("?").append(entry.getKey()).append("=").append(entry.getValue());
firstFlag = false;
} else {
sb.append("&").append(entry.getKey()).append("=").append(entry.getValue());
}
}
}
Request request = new Request
.Builder()
.url(sb.toString())
.build();
try (Response response = okHttpClient.newCall(request).execute()) {
int status = response.code();
if (status == 200) {
return Objects.requireNonNull(response.body()).string();
}
} catch (Exception e) {
log.error("okhttp put error >> ex = {}", ExceptionUtils.getStackTrace(e));
}
return responseBody;
}
/**
* post form with basic
*
* @param url 请求的url
* @param params post form 提交的参数
* @return
*/
public String postFormWithBasic(String url, Map<String, String> params, String username, String password) {
String basic = username + ":" + password;
String encode = Base64.getEncoder().encodeToString(basic.getBytes(StandardCharsets.UTF_8));
String responseBody = "";
FormBody.Builder builder = new FormBody.Builder();
//添加参数
if (params != null && params.keySet().size() > 0) {
for (String key : params.keySet()) {
builder.add(key, params.get(key));
}
}
Request request = new Request
.Builder()
.addHeader("Content-Type", "application/json")
.addHeader("Authorization", "Basic " + encode)
.url(url)
.post(builder.build())
.build();
try (Response response = okHttpClient.newCall(request).execute()) {
int status = response.code();
if (status == 200) {
return Objects.requireNonNull(response.body()).string();
}
} catch (Exception e) {
log.error("okhttp post error >> ex = {}", ExceptionUtils.getStackTrace(e));
}
return responseBody;
}
/**
* post json with basic
*
* @param url 请求的url
* @param jsonObject post json 提交的参数
* @return
*/
public String postJsonWithBasic(String url, JSONObject jsonObject, String username, String password) {
String basic = username + ":" + password;
String encode = Base64.getEncoder().encodeToString(basic.getBytes(StandardCharsets.UTF_8));
String responseBody = "";
RequestBody requestBody = FormBody.create(jsonObject.toString(), MediaType.parse("application/json; charset=utf-8"));
Request request = new Request
.Builder()
.addHeader("Content-Type", "application/json")
.addHeader("Authorization", "Basic " + encode)
.url(url)
.post(requestBody)
.build();
try (Response response = okHttpClient.newCall(request).execute()) {
int status = response.code();
if (status == 200) {
return Objects.requireNonNull(response.body()).string();
}
} catch (Exception e) {
log.error("okhttp post error >> ex = {}", ExceptionUtils.getStackTrace(e));
}
return responseBody;
}
/**
* post json with basic
*
* @param url 请求的url
* @param jsonObject post json 提交的参数
* @return
*/
public String putJsonWithKey(String url, JSONObject jsonObject, String key) {
String responseBody = "";
RequestBody requestBody = FormBody.create(jsonObject.toString(), MediaType.parse("application/json; charset=utf-8"));
Request request = new Request
.Builder()
.addHeader("Content-Type", "application/json")
.addHeader("Authorization", "Basic " + key)
.url(url)
.put(requestBody)
.build();
try (Response response = okHttpClient.newCall(request).execute()) {
int status = response.code();
if (status == 200) {
return Objects.requireNonNull(response.body()).string();
}
} catch (Exception e) {
log.error("okhttp post error >> ex = {}", ExceptionUtils.getStackTrace(e));
}
return responseBody;
}
/**
* post
*
* @param url 请求的url
* @param params post form 提交的参数
* @return
*/
public String post(String url, Map<String, String> params) {
String responseBody = "";
FormBody.Builder builder = new FormBody.Builder();
//添加参数
if (params != null && params.keySet().size() > 0) {
for (String key : params.keySet()) {
builder.add(key, params.get(key));
}
}
Request request = new Request
.Builder()
.url(url)
.post(builder.build())
.build();
try (Response response = okHttpClient.newCall(request).execute()) {
int status = response.code();
if (status == 200) {
return Objects.requireNonNull(response.body()).string();
}
} catch (Exception e) {
log.error("okhttp post error >> ex = {}", ExceptionUtils.getStackTrace(e));
}
return responseBody;
}
/**
* post 上传文件
*
* @param url
* @param params
* @param fileType
* @return
*/
public String postFile(String url, Map<String, Object> params, String fileType) {
String responseBody = "";
MultipartBody.Builder builder = new MultipartBody.Builder();
//添加参数
if (params != null && params.keySet().size() > 0) {
for (String key : params.keySet()) {
if (params.get(key) instanceof File) {
File file = (File) params.get(key);
builder.addFormDataPart(key, file.getName(), RequestBody.create(file, MediaType.parse(fileType)));
continue;
}
builder.addFormDataPart(key, params.get(key).toString());
}
}
Request request = new Request
.Builder()
.url(url)
.post(builder.build())
.build();
try (Response response = okHttpClient.newCall(request).execute()) {
int status = response.code();
if (status == 200) {
return Objects.requireNonNull(response.body()).string();
}
} catch (Exception e) {
log.error("okhttp postFile error >> ex = {}", ExceptionUtils.getStackTrace(e));
}
return responseBody;
}
}在这里插入代码片
Java HttpUtil
最新推荐文章于 2024-08-15 22:28:28 发布