okhttp同步异步请求工具

package com.tairanchina.common.util;

import com.squareup.okhttp.Callback;
import com.squareup.okhttp.MediaType;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Request.Builder;
import com.squareup.okhttp.RequestBody;
import com.squareup.okhttp.Response;

import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.TimeUnit;

/**
 * @author tjf
 * @ClassName: OkHttpUtil
 * @Description: okhttp工具类,支持同步,异步操作
 * @date 2016年11月2日下午3:15:07
 */
public class OkHttpUtil {

    /**
     * 静态属性和静态块它们彼此都有可能会用到对方,静态块中如果用到未初始化的静态属性
     * 可在编译期约束避免它们的地位相对平等,且加载顺序也须是单线程就按照它们在代码中的出现顺序排序
     */
    private static final OkHttpClient mOkHttpClient = new OkHttpClient();

    static {
        mOkHttpClient.setConnectTimeout(30, TimeUnit.SECONDS);
    }

    /**
     * 私有防止外部实例化,创建一个新的实例 OkHttpUtil.
     */
    private OkHttpUtil() {
    }

    /**
     * @param request
     * @description: 开启同步线程。
     * @name: execute
     * @author: hztjf
     * @date: 2018/12/12 10:16
     * @return: com.squareup.okhttp.Response
     * @throws: IOException
     * @modifyLog: 如需更改此函数,请添加记录,格式:add by hztjf 2018/12/12 10:16 修改理由
     */
    public static Response execute(Request request) throws IOException {
        return mOkHttpClient.newCall(request).execute();
    }

    /**
     * @param request
     * @param responseCallback
     * @description: 开启异步线程访问网络
     * @name: enqueue
     * @author: hztjf
     * @date: 2018/12/12 10:15
     * @return: void
     * @throws: 如有特殊异常,请说明
     * @modifyLog: 如需更改此函数,请添加记录,格式:add by hztjf 2018/12/12 10:15 修改理由
     */
    public static void enqueue(Request request, Callback responseCallback) {
        mOkHttpClient.newCall(request).enqueue(responseCallback);
    }

    /**
     * @param request
     * @description: 开启异步线程访问网络, 且不在意返回结果(实现空callback)
     * @name: enqueue
     * @author: hztjf
     * @date: 2018/12/12 10:15
     * @return: void
     * @throws: 如有特殊异常,请说明
     * @modifyLog: 如需更改此函数,请添加记录,格式:add by hztjf 2018/12/12 10:15 修改理由
     */
    public static void enqueue(Request request) {
        mOkHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onResponse(Response arg0) throws IOException {
                // 异步不需要关注结果
            }

            @Override
            public void onFailure(Request arg0, IOException arg1) {
                // 异步不需要关注结果
            }
        });
    }

    /**
     * @param url
     * @description: 同步获取
     * @name: getSync
     * @author: hztjf
     * @date: 2018/12/12 10:17
     * @return: java.lang.Object
     * @throws: IOException
     * @modifyLog: 如需更改此函数,请添加记录,格式:add by hztjf 2018/12/12 10:17 修改理由
     */
    public static String getSync(String url) throws IOException {
        // 默认的是get方法,也可以显示调用get()方法
        Request request = new Request.Builder().url(url).build();
        Response response = execute(request);
        if (response.isSuccessful()) {
            return response.body().string();
        } else {
            // response.body().string()此方法只能调用一次,否则会抛出异常
            String strErrMsg = response.body().string();
            throw new IOException(strErrMsg);
        }
    }

    /**
     * @param url
     * @param callback
     * @description: 异步获取
     * @name: getAsync
     * @author: hztjf
     * @date: 2018/12/12 10:31
     * @return: void
     * @throws: 如有特殊异常,请说明
     * @modifyLog: 如需更改此函数,请添加记录,格式:add by hztjf 2018/12/12 10:31 修改理由
     */
    public static void getAsync(String url, Callback callback) throws IOException {
        Request request = new Request.Builder().url(url).build();
        enqueue(request, callback);
    }

    /**
     * @param url
     * @param mediaType
     * @param requestData
     * @description: 同步post提交数据
     * @name: postSync
     * @author: hztjf
     * @date: 2018/12/12 10:31
     * @return: java.lang.String
     * @throws: 如有特殊异常,请说明
     * @modifyLog: 如需更改此函数,请添加记录,格式:add by hztjf 2018/12/12 10:31 修改理由
     */
    public static String postSync(String url, MediaType mediaType, String requestData) throws IOException {
        RequestBody body = RequestBody.create(mediaType, requestData);
        Request request = new Request.Builder().url(url).post(body).build();
        Response response = execute(request);
        if (response.isSuccessful()) {
            return response.body().string();
        } else {
            // response.body().string()此方法只能调用一次,否则会抛出异常
            String strErrMsg = response.body().string();
            throw new IOException(strErrMsg);
        }
    }

    /**
     * @param request
     * @description: requestBody数据因为构造不同,导致参数不一致,为了统一接口,开放一个万能接口
     * @name: postSync
     * @author: hztjf
     * @date: 2018/12/12 10:31
     * @return: java.lang.String
     * @throws: 如有特殊异常,请说明
     * @modifyLog: 如需更改此函数,请添加记录,格式:add by hztjf 2018/12/12 10:31 修改理由
     */
    public static String postSync(Request request) throws IOException {
        Response response = execute(request);
        if (response.isSuccessful()) {
            return response.body().string();
        } else {
            // response.body().string()此方法只能调用一次,否则会抛出异常
            String strErrMsg = response.body().string();
            throw new IOException(strErrMsg);
        }
    }

    /**
     * @param url
     * @param mediaType
     * @param requestData
     * @param callback
     * @description: 异步post提交数据,不必等待结果,常见的比如上传文件
     * @name: postAsync
     * @author: hztjf
     * @date: 2018/12/12 10:30
     * @return: void
     * @throws: 如有特殊异常,请说明
     * @modifyLog: 如需更改此函数,请添加记录,格式:add by hztjf 2018/12/12 10:30 修改理由
     */
    public static void postAsync(String url, MediaType mediaType, String requestData, Callback callback) throws
            IOException {
        RequestBody body = RequestBody.create(mediaType, requestData);
        Request request = new Request.Builder().url(url).post(body).build();
        enqueue(request, callback);
    }

    /**
     * @param request
     * @param callback
     * @description: requestBody数据因为构造不同,导致参数不一致,为了统一接口,开放一个万能接口
     * @name: postAsync
     * @author: hztjf
     * @date: 2018/12/12 10:30
     * @return: void
     * @throws: 如有特殊异常,请说明
     * @modifyLog: 如需更改此函数,请添加记录,格式:add by hztjf 2018/12/12 10:30 修改理由
     */
    public static void postAsync(Request request, Callback callback) throws IOException {
        enqueue(request, callback);
    }

    /**
     * @param headerMap
     * @param url
     * @param mediaType
     * @param requestData
     * @description: post的另一种方式,带有构造头部
     * @name: postAttachHeader
     * @author: hztjf
     * @date: 2018/12/12 10:30
     * @return: void
     * @throws: 如有特殊异常,请说明
     * @modifyLog: 如需更改此函数,请添加记录,格式:add by hztjf 2018/12/12 10:30 修改理由
     */
    public static void postAttachHeader(Map<String, String> headerMap, String url, MediaType mediaType, String
            requestData) throws Exception {
        Builder build = new Request.Builder();
        build.url(url);
        bulidHeader(build, headerMap);
        RequestBody body = RequestBody.create(mediaType, requestData);
        build.post(body);
        Request request = build.build();
        Response response = execute(request);
        if (response.isSuccessful()) {
            return;
        } else {
            // response.body().string()此方法只能调用一次,否则会抛出异常
            String strErrMsg = response.body().string();
            throw new IOException(strErrMsg);
        }
    }

    /**
     * @param url
     * @param mediaType
     * @param requestData
     * @description: 同步put提交数据
     * @name: putSync
     * @author: hztjf
     * @date: 2018/12/12 10:30
     * @return: java.lang.String
     * @throws: 如有特殊异常,请说明
     * @modifyLog: 如需更改此函数,请添加记录,格式:add by hztjf 2018/12/12 10:30 修改理由
     */
    public static String putSync(String url, MediaType mediaType, String requestData) throws IOException {
        RequestBody body = RequestBody.create(mediaType, requestData);
        Request request = new Request.Builder().url(url).put(body).build();
        Response response = execute(request);
        if (response.isSuccessful()) {
            return response.body().string();
        } else {
            // response.body().string()此方法只能调用一次,否则会抛出异常
            String strErrMsg = response.body().string();
            throw new IOException(strErrMsg);
        }
    }

    /**
     * @param build
     * @param headerMap
     * @description: 构造request header
     * @name: bulidHeader
     * @author: hztjf
     * @date: 2018/12/12 10:19
     * @return: void
     * @throws: 如有特殊异常,请说明
     * @modifyLog: 如需更改此函数,请添加记录,格式:add by hztjf 2018/12/12 10:19 修改理由
     */
    protected static void bulidHeader(Builder build, Map<String, String> headerMap) {
        if (headerMap != null && headerMap.size() > 0) {
            // 如果header参数多,不建议使用迭代器
            Iterator<Entry<String, String>> iter = headerMap.entrySet().iterator();
            while (iter.hasNext()) {
                Entry<String, String> entry = iter.next();
                build.header(entry.getKey(), entry.getValue());
            }
        }
    }

    /**
     * @param build
     * @param headerMap
     * @description: 构造request header jdk 8实现
     * @name: newBulidHeader
     * @author: hztjf
     * @date: 2018/12/12 10:21
     * @return: void
     * @throws: 如有特殊异常,请说明
     * @modifyLog: 如需更改此函数,请添加记录,格式:add by hztjf 2018/12/12 10:21 修改理由
     */
    protected static void newBulidHeader(Builder build, Map<String, String> headerMap) {
        if (headerMap != null && headerMap.size() > 0) {
            headerMap.forEach((k, v) -> build.addHeader(k, v));
        }
    }

    /**
     * @param url
     * @param name
     * @param value
     * @description: 为HttpGet 的 url 方便的添加1个name value 参数
     * @name: attachHttpGetParam
     * @author: hztjf
     * @date: 2018/12/12 10:18
     * @return: java.lang.String
     * @throws: 如有特殊异常,请说明
     * @modifyLog: 如需更改此函数,请添加记录,格式:add by hztjf 2018/12/12 10:18 修改理由
     */
    public static String attachHttpGetParam(String url, String name, String value) {
        return url + "?" + name + "=" + value;
    }

    /**
     * @param
     * @description: 恶汉型单例模型
     * @name: getInstance
     * @author: hztjf
     * @date: 2018/12/12 10:18
     * @return: com.squareup.okhttp.OkHttpClient
     * @throws: 如有特殊异常,请说明
     * @modifyLog: 如需更改此函数,请添加记录,格式:add by hztjf 2018/12/12 10:18 修改理由
     */
    public OkHttpClient getInstance() {
        return mOkHttpClient;
    }
}
发布了100 篇原创文章 · 获赞 300 · 访问量 68万+

猜你喜欢

转载自blog.csdn.net/win7system/article/details/86541470
今日推荐