OkHttp简单功能封装

来源:互联网 发布:国密算法标准 编辑:程序博客网 时间:2024/06/07 05:45

        之前写了一个小程序,里面用到了许多的OkHttp的方法,每次使用get或post请求都要写一大段,而且大部分是重复的,所以自己写了一个简单的类来封装OkHttp的一些常用方法,后续会根据自己用到的方法来不断的增加。下面是代码,修改一下包名可以直接用,记得添加依赖( compile ‘com.squareup.okhttp:okhttp:2.5.0’)。

package zcx14.nju.tool;import android.util.Log;import android.widget.ImageView;import com.squareup.okhttp.Callback;import com.squareup.okhttp.FormEncodingBuilder;import com.squareup.okhttp.Interceptor;import com.squareup.okhttp.MediaType;import com.squareup.okhttp.OkHttpClient;import com.squareup.okhttp.Request;import com.squareup.okhttp.RequestBody;import java.io.IOException;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.concurrent.TimeUnit;/** * Created by zcx on 2017/6/26. * 说明:常用的OkHttp方法的封装,对于有必要说明的参数,用@param标识了 */public class OkHttp_Simple {    private OkHttpClient client;    private Map<String, String> params;    private boolean jsonParams;    public OkHttp_Simple() {        //初始化,设置一些默认属性        reset();    }    /**     * 重置,清空参数,属性设为默认值     * */    public void reset() {        client = new OkHttpClient();        params = new HashMap<>();        jsonParams = false;        //默认的连接超时时间        client.setConnectTimeout(10, TimeUnit.SECONDS);        //默认的读取超时时间        client.setReadTimeout(10, TimeUnit.SECONDS);    }    /**     * 设置post的参数使用json格式,默认keyvalue格式     * */    public void setJsonParams() {        jsonParams = true;    }    /**     * 设置连接超时时间,参数为时间数和单位     */    public OkHttp_Simple setConnectTimeout(int num, TimeUnit unit) {        client.setConnectTimeout(num, unit);        return this;    }    /**     * 设置读取超时时间,参数为时间数和单位     * */    public OkHttp_Simple setReadTimeOut(int num, TimeUnit unit) {        client.setReadTimeout(num, unit);        return this;    }    /**     * 设置参数,参数的键值规定为String     * */    public OkHttp_Simple addParameter(String key, String value) {        params.put(key, value);        return this;    }    /**     * 添加拦截器     * */    public OkHttp_Simple addInterceptor(Interceptor interceptor) {        client.networkInterceptors().add(interceptor);        return this;    }    /**     *     异步的的get方法,如果有参数,就通过直接在url后添加的方式添加     */    public void asynGet(String url, Callback callback) {        //如果有参数执行        if(params.size() != 0) {            url += "?";            //将参数添加到http请求的末尾            Iterator<Map.Entry<String, String>> iterator = params.entrySet().iterator();            while(iterator.hasNext()) {                Map.Entry<String, String> next = iterator.next();                url += next.getKey() + "=" + next.getValue();                if(iterator.hasNext()) {                    url += "&";                }            }            //清空参数            params = new HashMap<>();        }        //发送请求        Request request = new Request.Builder().url(url).build();        client.newCall(request).enqueue(callback);        reset();    }    /**     * 异步的post方法     */    public void asynPost(String url, Callback callback) {        RequestBody body = null;        if(jsonParams) {            String value = "{";            Iterator<Map.Entry<String, String>> iterator = params.entrySet().iterator();            while(iterator.hasNext()) {                Map.Entry<String, String> next = iterator.next();                value += "\"" + next.getKey() + "\":\"" + next.getValue() + "\"";                if(iterator.hasNext()) {                    value += ",";                }            }            value += "}";            //清空参数            params = new HashMap<>();            MediaType json = MediaType.parse("application/json; charset=utf-8");            body = RequestBody.create(json, value);        } else {            FormEncodingBuilder form = new FormEncodingBuilder();            //如果有参数,就加进requestbody            Iterator<Map.Entry<String, String>> iterator = params.entrySet().iterator();            while(iterator.hasNext()) {                Map.Entry<String, String> next = iterator.next();                form.add(next.getKey(), next.getValue());            }            //清空参数            params = new HashMap<>();            body = form.build();        }        Request request = new Request.Builder().post(body).url(url).build();        client.newCall(request).enqueue(callback);        reset();    }    /**     * 同步的get方法(在主线程中使用会抛异常,尽量使用异步吧)     * */    public String synGet(String url) throws IOException{        //如果有参数执行        if(params.size() != 0) {            url += "?";            //将参数添加到http请求的末尾            Iterator<Map.Entry<String, String>> iterator = params.entrySet().iterator();            while(iterator.hasNext()) {                Map.Entry<String, String> next = iterator.next();                url += next.getKey() + "=" + next.getValue();                if(iterator.hasNext()) {                    url += "&";                }            }            //清空参数            params = new HashMap<>();        }        //发送请求        Request request = new Request.Builder().url(url).build();        String result = client.newCall(request).execute().body().string();        reset();        return result;    }    /**     * 同步的post方法(在主线程中使用会抛异常,尽量使用异步吧)     */    public String synPost(String url) throws IOException {        FormEncodingBuilder form = new FormEncodingBuilder();        //如果有参数,就加进requestbody        Iterator<Map.Entry<String, String>> iterator = params.entrySet().iterator();        while(iterator.hasNext()) {            Map.Entry<String, String> next = iterator.next();            form.add(next.getKey(), next.getValue());        }        //清空参数        params = new HashMap<>();        RequestBody body = form.build();        Request request = new Request.Builder().post(body).url(url).build();        String result = client.newCall(request).execute().body().string();        reset();        return result;    }}

        方法的用法说明在方法上都有注释了。
        这个封装类为OkHttp设置了一些基本的默认值,包括连接超时时间,读取超时时间。可以设置拦截器来设置request或response的属性,支持同步或异步的get和post方法。其中post的参数支持json格式或者keyvalue格式,只要通过setJsonParams()方法来设置就行了。添加参数使用addParameter方法(无论是get还是post)。要清空参数或者将属性重置为默认值,调用reset()方法
        后续会继续添加下载/上传文件的方法,还有简单设置request和response属性(封装拦截器代码)的方法。