封装okHttpUtil进行远程调用rpc
网上找了很多例子 不适用 自己动手封装了一个
需要依赖:
<!--okhttp请求-->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.14.9</version>
</dependency>
已经封装好的工具类:
package com.nari.pbsmerge.executor.utils;
import okhttp3.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
* @author: fangdie
* @description: okHttp3 rpc远程调用
* @date: 2021/12/21 14:37
* @return
*/
public class OkHttpUtil {
public static final long DEFAULT_READ_TIMEOUT_MILLIS = 1 * 1000; //默认 读 超时时间
public static final long DEFAULT_WRITE_TIMEOUT_MILLIS = 1 * 1000; //默认 写 超时时间
public static final long DEFAULT_CONNECT_TIMEOUT_MILLIS = 1 * 1000; //默认 连接 超时时间
private static OkHttpClient okHttpClient;
private static OkHttpClient.Builder clientBuilder;
/**
* @author: fangdie
* @description: 执行一个GET请求
* 返回失败返回null
* @date: 2021/12/17 15:59
* @return
*/
public static String get(String url) throws IOException {
return get(url, null);
}
/**
* @author: fangdie
* @description: 执行一个GET请求 带请求头
* @date: 2021/12/17 16:00
* @return
*/
public static String get(String url, Map<String, String> headerMap) throws IOException {
Response response = null;
try {
response = getOkHttpClient().newCall(getRequest(url, headerMap)).execute();
} catch (Throwable t) {
t.printStackTrace();
}
return response.body().string();
}
/**
* @author: fangdie
* @description: 执行一个get请求 带拼接参数 请求头
* @date: 2021/12/21 15:22
* @return
*/
public static String get(String url, Map<String, String> requestParameters,Map<String, String> headerMap) throws IOException {
Response response = null;
try {
response = getOkHttpClient().newCall(getRequest(url,headerMap, requestParameters)).execute();
} catch (Throwable t) {
t.printStackTrace();
}
return response.body().string();
}
/**
* @author: fangdie
* @description: 获取一个GET类型的请求 有请求头 url
* @param url 请求的url
* @date: 2021/12/17 16:09
* @return
*/
public static Request getRequest(String url, Map<String, String> headers) {
Request.Builder builder = new Request.Builder();
builder.url(url);
builder.get();
setHeaderAndUA(builder, headers);
return builder.build();
}
/**
* @author: fangdie
* @description: 获取一个GET类型的请求 有请求头 url 和get参数拼接
* @date: 2021/12/17 16:27
* @return
*/
public static Request getRequest(String url, Map<String, String> headers,Map<?,?> requestParameters) {
Request.Builder builder = new Request.Builder();
builder.url(getUrlParams(url,requestParameters));
builder.get();
setHeaderAndUA(builder, headers);
return builder.build();
}
/**
* @author: fangdie
* @description: 设置请求头和UA
* @date: 2021/12/17 16:10
* @return
*/
private static void setHeaderAndUA(Request.Builder builder, Map<String, String> header) {
if (header != null) {
builder.headers(setHeaders(header));
}
}
/**
* @author: fangdie
* @description: 将map转换为okhttp3需要的header
* @date: 2021/12/17 16:11
* @return
*/
private static Headers setHeaders(Map<String, String> headersParams) {
Headers.Builder builder = new Headers.Builder();
if (headersParams != null) {
for (Map.Entry<String, String> entry : headersParams.entrySet()) {
if (entry != null) {
builder.add(entry.getKey(), entry.getValue());
}
}
}
return builder.build();
}
/**
* @author: fangdie
* @description: 获取一个OkHttpClient
* @date: 2021/12/17 16:01
* @return
*/
public static OkHttpClient getOkHttpClient() {
return getOkHttpClient(null);
}
/**
* @author: fangdie
* @description: 创建okHttp
* @date: 2021/12/17 16:12
* @return
*/
public static OkHttpClient getOkHttpClient(Map<String, String> cookies) {
if (okHttpClient == null) {
okHttpClient = getClientBuilder(cookies).build();
}
return okHttpClient;
}
/**
* @author: fangdie
* @description: 要转入的cookies 可为null
* @date: 2021/12/17 16:05
* @return
*/
public static OkHttpClient.Builder getClientBuilder(Map<String, String> cookies) {
if (clientBuilder == null) {
clientBuilder = new OkHttpClient.Builder();
clientBuilder.connectTimeout(DEFAULT_CONNECT_TIMEOUT_MILLIS, TimeUnit.SECONDS)
.writeTimeout(DEFAULT_WRITE_TIMEOUT_MILLIS, TimeUnit.SECONDS)
.readTimeout(DEFAULT_READ_TIMEOUT_MILLIS, TimeUnit.SECONDS);
if (cookies != null) {
clientBuilder.cookieJar(setCookie(cookies));
}
// 缺失部分 这里没有用的cookies所以后期再补充
}
return clientBuilder;
}
/**
* @author: fangdie
* @description: 管理cookie
* @date: 2021/12/17 16:07
* @return
*/
private static CookieJar setCookie(Map<String, String> cookies) {
final List list = new ArrayList();
for (Map.Entry<String, String> entry : cookies.entrySet()) {
list.add(new Cookie.Builder().name(entry.getKey()).value(entry.getValue()).domain("").build());
}
return new CookieJar() {@Override
public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
}
@Override
public List<Cookie> loadForRequest(HttpUrl url) {
return list;
}
};
}
/**
* @author: fangdie
* @description: 通过get方式拼接参数
* @date: 2021/12/17 16:25
* @return
*/
private static String getUrlParams(String url,Map<?,?> requestParamMap){
StringBuffer buffer = new StringBuffer();
buffer.append(url);
if (requestParamMap != null) {
for (Map.Entry<?, ?> entry : requestParamMap.entrySet()) {
Object key = entry.getKey();
Object value = entry.getValue();
if(buffer.length()>0){
buffer.append("&").append(key).append("=").append(value);
}else {
buffer.append("?").append(key).append("=").append(value);
}
}
}
return buffer.toString();
}
/**
* @author: fangdie
* @description: post请求方式的请求参数渲染方式
* @date: 2021/12/17 16:30
* @return
*/
private static FormBody.Builder addParamToBuilder(Map<String,String> requestParamMap){
FormBody.Builder formBody = new FormBody.Builder();
if (requestParamMap != null) {
for (Map.Entry<String, String> entry : requestParamMap.entrySet()) {
if (entry != null) {
String key = entry.getKey();
String value = entry.getValue();
if (key != null && value != null) {
formBody.add(key, value);
}
}
}
}
return formBody;
}
public static void main(String[] args) {
}
}
直接调用:
String s = OkHttpUtil.get(dto.getRequestUrl(), headerMap);
// 调用结果转map 通过gson转
Map<String,Object> map = new Gson().fromJson(s, Map.class);