基于okhttp的简单封装

来源:互联网 发布:世界观 知乎 编辑:程序博客网 时间:2024/05/17 03:41
/** * Created by zhaozhe on 2017/6/5/005. */public class OKHttpManager {    private volatile static OKHttpManager manager;   //防止多个线程访问时    private final String TAG = OKHttpManager.class.getSimpleName();  //获得类名    private Handler handler;    private static final String BASE_URL = "http://xxx.com/openapi";//请求接口根地址    private static final MediaType MEDIA_TYPE_JSON = MediaType.parse("application/json; charset=utf-8");//mdiatype 这个需要和服务端保持一致    private static final MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("text/x-markdown; charset=utf-8");//mdiatype 这个需要和服务端保持一致    private OkHttpClient mOkHttpClient;//okHttpClient 实例    public static final int TYPE_GET = 0;//get请求    public static final int TYPE_POST_JSON = 1;//post请求参数为json    public static final int TYPE_POST_FORM = 2;//post请求参数为表单    private OKHttpManager() {        //初始化OkHttpClient        mOkHttpClient = new OkHttpClient().newBuilder()                .connectTimeout(10, TimeUnit.SECONDS)//设置超时时间                .readTimeout(10, TimeUnit.SECONDS)//设置读取超时时间                .writeTimeout(10, TimeUnit.SECONDS)//设置写入超时时间                .build();        handler = new Handler(Looper.getMainLooper());    }    //采用单例模式获取对象    public static OKHttpManager getInstance() {        OKHttpManager instance = null;        if (manager == null) {            synchronized (OKHttpManager.class) {                //同步代码块                if (instance == null) {                    instance = new OKHttpManager();                    manager = instance;                }            }        }        return instance;    }    /**     * okHttp同步请求统一入口     *     * @param actionUrl   接口地址     * @param requestType 请求类型     * @param json   请求参数     */    public void requestSync(String actionUrl, int requestType, String json) {        switch (requestType) {            case TYPE_GET:                requestGetBySync(actionUrl);                break;            case TYPE_POST_JSON:                requestPostBySync(actionUrl, json);                break;            case TYPE_POST_FORM://                requestPostBySynWithForm(actionUrl, paramsMap);                break;        }    }    /**     * okHttp get同步请求     *     * @param actionUrl 接口地址     */    private void requestGetBySync(String actionUrl) {        StringBuilder tempParams = new StringBuilder();        try {            //补全请求地址            String requestUrl = String.format("%s/%s?%s", BASE_URL, actionUrl);            //创建一个请求            Request request = addHeaders().url(requestUrl).get().build();            //创建一个Call            final Call call = mOkHttpClient.newCall(request);            //执行请求            final Response response = call.execute();            response.body().string();        } catch (Exception e) {            Log.e(TAG, e.toString());        }    }    /**     * okHttp post同步请求     *     * @param actionUrl 接口地址     * @param json 请求参数     */    private void requestPostBySync(String actionUrl, String json) {        try {            //补全请求地址            String requestUrl = String.format("%s/%s", BASE_URL, actionUrl);            //创建一个请求实体对象 RequestBody            RequestBody body = RequestBody.create(MEDIA_TYPE_JSON, json);            //创建一个请求            final Request request = addHeaders().url(requestUrl).post(body).build();            //创建一个Call            final Call call = mOkHttpClient.newCall(request);            //执行请求            Response response = call.execute();            //请求执行成功            if (response.isSuccessful()) {                //获取返回数据 可以是String,bytes ,byteStream                Log.e(TAG, "response ----->" + response.body().string());            }        } catch (Exception e) {            Log.e(TAG, e.toString());        }    }    /**     * 统一为请求添加头信息     *     * @return     */    private Request.Builder addHeaders() {        Request.Builder builder = new Request.Builder()                .addHeader("Connection", "keep-alive")                .addHeader("platform", "2")                .addHeader("phoneModel", Build.MODEL)                .addHeader("systemVersion", Build.VERSION.RELEASE)                .addHeader("appVersion", "3.2.0");        return builder;    }    /**     * okHttp post同步请求表单提交     *     * @param actionUrl 接口地址     * @param paramsMap 请求参数     */    private void requestPostBySynWithForm(String actionUrl, HashMap<String, String> paramsMap) {        try {            //创建一个FormBody.Builder            FormBody.Builder builder = new FormBody.Builder();            for (String key : paramsMap.keySet()) {                //追加表单信息                builder.add(key, paramsMap.get(key));            }            //生成表单实体对象            RequestBody formBody = builder.build();            //补全请求地址            String requestUrl = String.format("%s/%s", BASE_URL, actionUrl);            //创建一个请求            final Request request = addHeaders().url(requestUrl).post(formBody).build();            //创建一个Call            final Call call = mOkHttpClient.newCall(request);            //执行请求            Response response = call.execute();            if (response.isSuccessful()) {                Log.e(TAG, "response ----->" + response.body().string());            }        } catch (Exception e) {            Log.e(TAG, e.toString());        }    }    /**     * okHttp异步请求统一入口     *     * @param actionUrl   接口地址     * @param requestType 请求类型     * @param json   请求参数     * @param callBack    请求返回数据回调     * @param <T>         数据泛型     **/    public <T> Call requestAsyn(String actionUrl, int requestType, String json, ReqCallBack<T> callBack) {        Call call = null;        switch (requestType) {            case TYPE_GET:                call = requestGetByAsyn(actionUrl,callBack);                break;            case TYPE_POST_JSON:                call = requestPostByAsyn(actionUrl, json, callBack);                break;            case TYPE_POST_FORM://                call = requestPostByAsynWithForm(actionUrl, paramsMap, callBack);                break;        }        return call;    }    /**     * okHttp get异步请求     *     * @param actionUrl 接口地址     * @param callBack  请求返回数据回调     * @param <T>       数据泛型     * @return     */    private <T> Call requestGetByAsyn(String actionUrl, final ReqCallBack<T> callBack) {        try {            String requestUrl = String.format("%s/%s?%s", BASE_URL, actionUrl);            final Request request = addHeaders().url(requestUrl).get().build();            final Call call = mOkHttpClient.newCall(request);            call.enqueue(new Callback() {                @Override                public void onFailure(Call call, IOException e) {                    failedCallBack("访问失败", callBack);                    Log.e(TAG, e.toString());                }                @Override                public void onResponse(Call call, Response response) throws IOException {                    if (response.isSuccessful()) {                        String string = response.body().string();                        Log.e(TAG, "response ----->" + string);                        successCallBack((T) string, callBack);                    } else {                        failedCallBack("服务器错误", callBack);                    }                }            });            return call;        } catch (Exception e) {            Log.e(TAG, e.toString());        }        return null;    }    /**     * okHttp post异步请求     *     * @param actionUrl 接口地址     * @param json 请求参数     * @param callBack  请求返回数据回调     * @param <T>       数据泛型     * @return     */    private <T> Call requestPostByAsyn(String actionUrl, String json, final ReqCallBack<T> callBack) {        try {            RequestBody body = RequestBody.create(MEDIA_TYPE_JSON, json);            String requestUrl = String.format("%s/%s", BASE_URL, actionUrl);            final Request request = addHeaders().url(requestUrl).post(body).build();            final Call call = mOkHttpClient.newCall(request);            call.enqueue(new Callback() {                @Override                public void onFailure(Call call, IOException e) {                    failedCallBack("访问失败", callBack);                    Log.e(TAG, e.toString());                }                @Override                public void onResponse(Call call, Response response) throws IOException {                    if (response.isSuccessful()) {                        String string = response.body().string();                        Log.e(TAG, "response ----->" + string);                        successCallBack((T) string, callBack);                    } else {                        failedCallBack("服务器错误", callBack);                    }                }            });            return call;        } catch (Exception e) {            Log.e(TAG, e.toString());        }        return null;    }    /**     * okHttp post异步请求表单提交     *     * @param actionUrl 接口地址     * @param paramsMap 请求参数     * @param callBack  请求返回数据回调     * @param <T>       数据泛型     * @return     */    private <T> Call requestPostByAsynWithForm(String actionUrl, HashMap<String, String> paramsMap, final ReqCallBack<T> callBack) {        try {            FormBody.Builder builder = new FormBody.Builder();            for (String key : paramsMap.keySet()) {                builder.add(key, paramsMap.get(key));            }            RequestBody formBody = builder.build();            String requestUrl = String.format("%s/%s", BASE_URL, actionUrl);            final Request request = addHeaders().url(requestUrl).post(formBody).build();            final Call call = mOkHttpClient.newCall(request);            call.enqueue(new Callback() {                @Override                public void onFailure(Call call, IOException e) {                    failedCallBack("访问失败", callBack);                    Log.e(TAG, e.toString());                }                @Override                public void onResponse(Call call, Response response) throws IOException {                    if (response.isSuccessful()) {                        String string = response.body().string();                        Log.e(TAG, "response ----->" + string);                        successCallBack((T) string, callBack);                    } else {                        failedCallBack("服务器错误", callBack);                    }                }            });            return call;        } catch (Exception e) {            Log.e(TAG, e.toString());        }        return null;    }    /**     * 统一同意处理成功信息     *     * @param result     * @param callBack     * @param <T>     */    private <T> void successCallBack(final T result, final ReqCallBack<T> callBack) {        handler.post(new Runnable() {            @Override            public void run() {                if (callBack != null) {                    callBack.onReqSuccess(result);                }            }        });    }    /**     * 统一处理失败信息     *     * @param errorMsg     * @param callBack     * @param <T>     */    private <T> void failedCallBack(final String errorMsg, final ReqCallBack<T> callBack) {        handler.post(new Runnable() {            @Override            public void run() {                if (callBack != null) {                    callBack.onReqFailed(errorMsg);                }            }        });    }    public interface ReqCallBack<T> {        /**         * 响应成功         */        void onReqSuccess(T result);        /**         * 响应失败         */        void onReqFailed(String errorMsg);    }}
原创粉丝点击