项目中会使用OkHttp3来调用restful接口.步骤如下.
pom文件引入依赖.
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.14.2</version>
</dependency>
底层utils(调用接口的参数需要用token,这个每个项目可能不一样)
@Slf4j
@Component
public class RestfulUtils {
/**
* 使用get方式发起Http同步请求, 返回值为String
*
* @param url url,也可以直接在URL中放入请求参数,但请注意转义问题.例如:值里面包含=
* @param params 请求参数,推荐将请求参数放入这里,本方法会自动转移特殊字符.
* @return String
* @author namelessmyth
*/
public String getString(String url, Map<String, String> params) throws Exception {
String result = null;
try {
Request.Builder requestBuilder = new Request.Builder();
if (!url.contains("?")) {
String urlParams = HttpUtil.toParams(params);
url = url + "?" + urlParams;
}
requestBuilder.url(url);
requestBuilder.addHeader("Authorization", "Bearer " + TokenUtils.getToken());
requestBuilder.get();
OkHttpClient client = getOkHttpClient();
Response response = client.newCall(requestBuilder.build()).execute();
result = response.body().string();
//log.info(String.format("(%s)url.getString,result:%s", url, params, result));
} catch (Exception e) {
log.error(String.format("(%s)url.getString,exception!", url, params), e);
throw e;
}
return result;
}
/**
* 使用post方式发起Http同步请求,返回值为String
*
* @param url url
* @param params 请求参数,也可以直接放在URL中
* @return String
* @author namelessmyth
*/
public String postString(String url, Map<String, String> params) throws Exception {
String result = null;
RequestBody requestBody = getRequestBody(url, params);
try {
Request.Builder requestBuilder = new Request.Builder().url(url);
requestBuilder.addHeader("Authorization", "Bearer " + TokenUtils.getToken());
requestBuilder.post(requestBody);
OkHttpClient client = getOkHttpClient();
Response response = client.newCall(requestBuilder.build()).execute();
result = response.body().string();
log.info(String.format("(%s)url.postString.param(%s),result:%s", url, params, result));
} catch (Exception e) {
log.error(String.format("(%s)url.postString.param(%s),exception!", url, params), e);
throw e;
}
return result;
}
public RequestBody getRequestBody(String url, Map<String, String> params) {
RequestBody requestBody = null;
try {
FormBody.Builder builder = new FormBody.Builder();
if (MapUtil.isNotEmpty(params)) {
for (Map.Entry<String, String> entry : params.entrySet()) {
builder.add(entry.getKey(), entry.getValue());
}
}
requestBody = builder.build();
} catch (Exception e) {
log.error(url + "getRequestBody exception" + params, e);
throw new BusinessException(e);
}
return requestBody;
}
public OkHttpClient getOkHttpClient() {
//参数可以考虑做成配置项
ConnectionPool pool = new ConnectionPool(5, 1, TimeUnit.SECONDS);//最大空闲数5个,每个连接最大空闲时间1S
OkHttpClient client = new OkHttpClient.Builder() //
.connectTimeout(60, TimeUnit.SECONDS) 连接超时
.followRedirects(true) //
.readTimeout(60, TimeUnit.SECONDS) // //读取超时
.retryOnConnectionFailure(false) //
.writeTimeout(3, TimeUnit.SECONDS). 写超时
connectionPool(pool) //
.build();
return client;
}
}
业务层调用
@DS("middel")
public String queryOnlineWorkstage(String itemNumber, String factory) throws Exception {
String result = null;
if (StringUtils.isBlank(itemNumber) || StringUtils.isBlank(factory)) {
throw new BusinessException("物资编码或厂别不能为空!");
}
boolean flag = false;
InfoCode infoCode = iInfoCodeService.getInfoCode(factory, "在线工序");
String organizationId = infoCode.getCode();
String url = infoCode.getUrl();
HashMap<String, String> get_data = new HashMap<>();
get_data.put("organizationId", organizationId);
get_data.put("itemNum", itemNumber);
//调用restful接口查询
result = sccHttpUtils.getString(url, get_data);
return result;
}