工作需求记录:封装一个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);
posted @ 2025-08-28 15:39  ZEROdokiame  阅读(27)  评论(1)    收藏  举报