我們在工作中用http協議轉調其他接口,但很多時候我們在使用okhttp的工具類的 方法缺少很多,比如文件上傳,post,put,delete請求 工具類當中並不完整。有部分又沒有請求頭,讓人很是苦惱。這裏自己寫一份比較全的okhttp的工具類,來供大家參考。
1、我這裏引入的依賴爲。
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.10.0</version>
</dependency>
2、okhttp的工具類包含 文件上傳,get,post,put,delete請求
public class OkHttpClientUtil {
private static Logger logger = LoggerFactory.getLogger(OkHttpClientUtil.class);
private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
public static OkHttpClient client;
static {
client = new OkHttpClient.Builder()
.readTimeout(20000, TimeUnit.MILLISECONDS)
.writeTimeout(20000, TimeUnit.MILLISECONDS)
.connectTimeout(20000, TimeUnit.MILLISECONDS)
.build();
}
public static final String doUpload(Map<String, String> params, Map<String, String> headerParam,
final Map<String, File> fileMap, String mediaTypeStr, String url) {
Response response = null;
try {
if (StringUtils.isEmpty(url)) {
return null;
}
if (StringUtils.isEmpty(mediaTypeStr)) {
mediaTypeStr = "application/octet-stream";
}
MediaType mediaType = MediaType.parse(mediaTypeStr);
MultipartBody.Builder multipartBody = new MultipartBody.Builder().setType(MultipartBody.FORM);
for (Map.Entry<String, File> fileEntry : fileMap.entrySet()) {
File file = fileEntry.getValue();
RequestBody fileBody = MultipartBody.create(mediaType, file);
multipartBody.addFormDataPart(fileEntry.getKey(), file.getName(), fileBody);
}
if (!Objects.isNull(params) && params.size() > 0) {
for (Map.Entry<String, String> entry : params.entrySet()) {
multipartBody.addFormDataPart(entry.getKey(), entry.getValue());
}
}
MultipartBody requestBody = multipartBody.build();
Request.Builder builder = new Request.Builder();
if (!Objects.isNull(headerParam) && headerParam.size() > 0) {
for (Map.Entry<String, String> entry : headerParam.entrySet()) {
builder.addHeader(entry.getKey(), entry.getValue());
}
}
Request request = builder.post(requestBody).url(url).build();
response= client.newCall(request).execute();
if (response.isSuccessful()) {
return new String(response.body().bytes());
}else {
logger.error("[{}] having a error,param is:{}",url,String.valueOf(params));
}
} catch (Exception e) {
logger.error(e.getMessage(), e);
}finally {
if (!Objects.isNull(response)) {
response.close();
}
}
return "";
}
/**
* get 請求
* @param url 請求url地址
* @return string
* */
public static String doGet(String url) {
return doGet(url, null, null);
}
/**
* get 請求
* @param url 請求url地址
* @param params 請求參數 map
* @return string
* */
public String doGet(String url, Map<String, String> params) {
return doGet(url, params, null);
}
/**
* get 請求
*
* @param url 請求url地址
* @param params 請求參數 map
* @param headerMap 請求頭字段
* @return string
*/
public static String doGet(String url, Map<String, String> params, Map<String, String> headerMap) {
StringBuilder sb = new StringBuilder(url);
if (params != null && params.keySet().size() > 0) {
boolean firstFlag = true;
for (String key : params.keySet()) {
if (firstFlag) {
sb.append("?").append(key).append("=").append(params.get(key));
firstFlag = false;
} else {
sb.append("&").append(key).append("=").append(params.get(key));
}
}
}
Request.Builder builder = new Request.Builder();
if (headerMap != null && headerMap.size() > 0) {
for (Map.Entry<String, String> entry : headerMap.entrySet()) {
builder.addHeader(entry.getKey(), entry.getValue());
}
}
Request request = builder.url(sb.toString()).build();
logger.info("do get request and url[{}]", sb.toString());
return execute(request);
}
/**
* post 請求
*
* @param url 請求url地址
* @param params 請求參數 map
* @return string
*/
public static String doPost(String url, Map<String, String> params, Map<String, String> headerParam) {
FormBody formBody =addParamToBuilder(params);
Request.Builder request = buildHeader(headerParam);
Request buildRequest = request.post(formBody).url(url).build();
logger.info("do post request and url[{}]", url);
return execute(buildRequest);
}
public static String doPut(String url, Map<String, String> params, Map<String, String> headerParam) {
FormBody formBody =addParamToBuilder(params);
Request.Builder request = buildHeader(headerParam);
Request buildRequest = request.put(formBody).url(url).build();
logger.info("do put request and url[{}]", url);
return execute(buildRequest);
}
public static String doDelete(String url, Map<String, String> params, Map<String, String> headerParam) {
FormBody formBody =addParamToBuilder(params);
Request.Builder request = buildHeader(headerParam);
Request buildRequest = request.delete(formBody).url(url).build();
logger.info("do delete request and url[{}]", url);
return execute(buildRequest);
}
private static FormBody addParamToBuilder(Map<String, String> params){
FormBody.Builder builder = new FormBody.Builder();
if (params != null && params.keySet().size() > 0) {
for (String key : params.keySet()) {
builder.add(key, params.get(key));
}
}
return builder.build();
}
private static Request.Builder buildHeader(Map<String, String> headerParam){
Request.Builder request = new Request.Builder();
if (!Objects.isNull(headerParam) && headerParam.size() > 0) {
for (Map.Entry<String, String> entry : headerParam.entrySet()) {
request.addHeader(entry.getKey(), entry.getValue());
}
}
return request;
}
/**
* post 請求, 請求數據爲 json 的字符串
* @param url 請求url地址
* @param json 請求數據, json 字符串
* @return string
*/
public static String doPostJson(String url,Map<String,String> headermap, String json) {
logger.info("do post request and url[{}]", url);
return exectePost(url, json,headermap, JSON);
}
public static String doPutJson(String url, Map<String,String> headermap, String json) {
logger.info("do put request and url[{}]", url);
return exectePut(url, json,headermap, JSON);
}
public static String doDeleteJson(String url, Map<String,String> headermap, String json) {
logger.info("do delete request and url[{}]", url);
return execteDelete(url, json,headermap, JSON);
}
private static String exectePost(String url, String data,Map<String,String> headerMap, MediaType contentType) {
RequestBody requestBody = RequestBody.create(contentType, data);
// Request request = new Request.Builder().url(url).post(requestBody).build();
Request.Builder builder = buildHeader(headerMap);
Request request = builder.post(requestBody).url(url).build();
return execute(request);
}
private static String exectePut(String url, String data,Map<String,String> headerMap, MediaType contentType) {
RequestBody requestBody = RequestBody.create(contentType, data);
// Request request = new Request.Builder().url(url).put(requestBody).build();
Request.Builder builder = buildHeader(headerMap);
Request request = builder.put(requestBody).url(url).build();
return execute(request);
}
private static String execteDelete(String url, String data, Map<String,String> headerMap,MediaType contentType) {
RequestBody requestBody = RequestBody.create(contentType, data);
//Request request = new Request.Builder().url(url).delete(requestBody).build();
Request.Builder builder = buildHeader(headerMap);
Request request = builder.delete(requestBody).url(url).build();
return execute(request);
}
private static String execute(Request request) {
Response response = null;
try {
response = client.newCall(request).execute();
if (response.isSuccessful()) {
return new String(response.body().bytes());
}
} catch (Exception e) {
logger.error(e.getMessage(),e);
} finally {
if (response != null) {
response.close();
}
}
return "";
}
}