工作需求记录:封装一个HttpUtil来请求三方接口(使用Okhttp实现)
如果项目需要频繁请求第三方的接口接收数据,每次都按请求方式构建一次Http请求就显得过于繁琐,所以包装一个HttpUtil就显得很必要了。
提到HttpUtil,就不得不提到Okhttp,尽管对于大多数开发者而言,通常情况下使用的是往往它的封装版本Retrofit,不过其底层依然离不开Okhttp作为基础支撑。
新建一个Util类,然后我们就需要获取到OkHttpClient实例,这里用单例模式获取实例是非常好的选择,不然构建很多OkHttpClient会很占资源:先定义一个OkHttpClient类型的client再去build
private static OkHttpClient client;
private static OkHttpClient getInstance() {
if (client == null) {
synchronized (OkHttpClient.class) {
if (client == null) {
client = new OkHttpClient.Builder()
.connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS)
.readTimeout(READ_TIMEOUT, TimeUnit.SECONDS)
.build();
}
}
}
return client;
}
如果要创建Get或Post请求就少不了那些我们经常在Postman等测试工具里需要传入的各种参数和类型,我们可以直接把它们定义成final类型的常量去使用(还记得一篇代码优化文档里提到了,多用final)
这里比如认证方式,传参格式,编码类型都可以定义成final的常量:
private static final String DEFAULT_TYPE = "application/json; charset=utf-8";
private static final String DEFAULT_TYPE_FROM = "application/x-www-form-urlencoded";
private static final String COMMON_HEADER_KEY_WTOKEN = "wtoken";
private static final String COMMON_HEADER_KEY_AUTHORIZATION = "Authorization";
..........
接下来在建立发送Get和Post请求的方法之前,我们需要先用上这些常量,也就是添加公共请求头的方法。这里传入公共请求头依旧可以使用Okhttp的内置方法Headers:
private static Headers addCommonHeaderHttp(String wtoken, String authorization,Map<String, String> headers) {
Headers.Builder builder = new Headers.Builder();
if (StringUtils.isNotBlank(wtoken)) {
builder.add(COMMON_HEADER_KEY_WTOKEN, wtoken);
}
if (StringUtils.isNotBlank(authorization)) {
builder.add(COMMON_HEADER_KEY_AUTHORIZATION, authorization);
}
if(StringUtils.isNotBlank(headers.getOrDefault(COMMON_HEADER_KEY_API_KEY,""))) {
builder.add(COMMON_HEADER_KEY_API_KEY, headers.getOrDefault(COMMON_HEADER_KEY_API_KEY,""));
}
if(StringUtils.isNotBlank(headers.getOrDefault(COMMON_HEADER_KEY_SIGNATURE,""))) {
builder.add(COMMON_HEADER_KEY_SIGNATURE, headers.getOrDefault(COMMON_HEADER_KEY_SIGNATURE,""));
}
return builder.build();
}
请求头有了,那么根据三方API测试工具的流程,就需要正式发送Get或Post请求了
于是我们直接创建Get方法,用Okhttp的Request发送请求,并用Response响应:
Request request = new Request.Builder().headers(addCommonHeaderHttp(wtoken,authorization,new HashMap<String,String>())).url(url).build();
// 创建一个请求
Response response = getInstance()
.newCall(request).execute();
int httpCode = response.code();
String result;
okhttp3.ResponseBody body = response.body();
if (body != null) {
result = body.string();
addResponseLog(httpCode, result, startTime);
} else {
response.close();
throw new RuntimeException("exception in OkHttpUtil,response body is null");
}
return handleHttpResponse(httpCode, result, url);

浙公网安备 33010602011771号