自己项目中的 OKHttp的封装与使用

OKHttp的使用想起来大家都很熟悉了,今天分享一下我们自己的项目中封装的OKHttp。

因为项目的服务器框架中,请求成功和失败的返回是不一样的,错误码和错误信息,只有在OKHttp返回码不是200的情况下才返回,所以,我在网络框架层中进行了封装,将其中的细节返回到前台,以供给下一次操作。
1.首先:新建 net 包,再创建接口 CallBac  NetInterface类 NetTool,OKTool

2.CallBacK:这里定义了我们的回调,大家可以根据自己的需求自己添加方法。
根据这些回调,我们这好可以使用到LoadingLayout,关于loadinLayout的使用,请看我的这篇文章: http://blog.csdn.net/eueheuen/article/details/77163390
public interface CallBack<T> {
    //请求成功,数据正确,根据Bean返回我们的数据
    void onSuccess(T response);
    //请求成功后,数据回调失败,返回异常对象和异常信息
    void onError(Throwable e);
    //当错误信息返回在非200情况下(返回错误码和错误信息)
    void onDefMessage(String code,String msg);
    //网络404的情况(并不是没有网络)
    void onNotFound();
    //无网络的情况
    void onNoNet();
}
3.NetInterface
public interface NetInterface {
    //Post请求
    <T> void postRequest(Context context, String url, Map<String,String> map,Class<T> tClass,CallBack<T>callBack);

    //Get请求
    <T> void getRequest(Context context, String url, Map<String,String> map,Class<T> tClass,CallBack<T>callBack);

    //Put请求
    <T> void putRequest(Context context, String url, Map<String,String> map,Class<T> tClass,CallBack<T>callBack);

    //Delete请求
    <T> void deleteRequest(Context context, String url, Map<String,String> map,Class<T> tClass,CallBack<T>callBack);

    //Get直接返回Json数据
    void jsonRequest(Context context,String url,Map<String,String> map,CallBack<String> callBack);
}
4.OKTool: get  post  delete  put 请求 和 Get请求直接返回 json 数据
具体的里面都有注释
public class OKTool implements NetInterface {
    private OkHttpClient mOKHttpClient;
    private Handler mHandler = new Handler(Looper.getMainLooper());
    private Gson mGson;
    //数据传输格式
    public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");//Json
    public static final MediaType TEXT = MediaType.parse("application/x-www-form-urlencoded; charset=utf-8");//文本
    private static final MediaType MEDIA_TYPE_JPEG = MediaType.parse("image/jpeg");//图片

    public OKTool(){
        //初始化
        mGson = new Gson();
        //进行超时时间及缓存大小配置
        mOKHttpClient = new OkHttpClient.Builder()
                .retryOnConnectionFailure(true)
                .connectTimeout(5, TimeUnit.SECONDS)
                .cache(new Cache(Environment.getExternalStorageDirectory(), 10 * 1024 * 1024))
                .build();
    }
    //Post请求
    @Override
    public <T> void postRequest(final Context context, String url, Map<String, String> map, final Class<T> tClass, final CallBack<T> callBack) {

        //网络异常判断
        if (!Utils.checkNetworkAvailable(context)){
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    callBack.onNoNet();
                }
            });
            return;
        }

        String text = "";
        String key,value;
        //发送Json数据
        //final String jsonStr = mGson.toJson(map);

        //向服务器不发送json  发送 文本
        if (map!= null) {
            for (Map.Entry<String, String> entry : map.entrySet()) {
                key = entry.getKey();
                value = entry.getValue();
                text = text + "&" + (key + "=" + value);
            }
        }

        RequestBody requestBody = RequestBody.create(TEXT,text);
        final Request request = new Request.Builder().url(url)
                .post(requestBody)
                //Header头根据具体项目的规定去添加
                .addHeader("AID","20170630062508d2ib32lBty95o5RS")
                .addHeader("APIVER","v1.0")
                .addHeader("ACCEPT","application/json")
                .build();

        mOKHttpClient.newCall(request).enqueue(new Callback() {

            @Override
            public void onFailure(Call call, final IOException e) {
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        callBack.onError(e);
                    }
                });
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {

                String str = response.body().string();
                final T result;
                //成功
                if (response.code() == 200) {

                    try {
                        result = mGson.fromJson(str, tClass);
                        mHandler.post(new Runnable() {
                            @Override
                            public void run() {
                                callBack.onSuccess(result);
                            }
                        });
                    } catch (final Throwable e) {
                        mHandler.post(new Runnable() {
                            @Override
                            public void run() {
                                callBack.onError(e);
                            }
                        });
                    }

                //网址404的情况
                }else if (response.code() == 404){
                    callBack.onNotFound();
                }
                //返回错误信息的情况
                else {
                    JSONObject jsonObject = null;
                    try {

                        jsonObject = new JSONObject(str);
                        //msg和error_code根据具体的接口返回变动
                        final String msg = jsonObject.getString("msg");
                        final String errorCode = jsonObject.getString("error_code");

                        mHandler.post(new Runnable() {
                            @Override
                            public void run() {

                                callBack.onDefMessage(errorCode,msg);
                                if (("2002").equals(errorCode)||("2001").equals(errorCode)){
                                    //项目中设计到Token过期重新登陆,Token过期未 2002 2001
                                //    Utils.ShowTokenNewLogin(context);
                                }else {
                                    //将错误信息返回到前端
                                    callBack.onDefMessage(errorCode,msg);
                                }

                            }
                        });


                    } catch (JSONException e) {
                        e.printStackTrace();
                    }

                }
            }
        });
    }

    //Get请求
    @Override
    public <T> void getRequest(Context context, String url, Map<String, String> map, final Class<T> tClass, final CallBack<T> callBack) {

        //网络异常判断
        if (!Utils.checkNetworkAvailable(context)){
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    callBack.onNoNet();
                }
            });
            return;
        }

        String text = "";
        String key,value;
        //发送Json数据
        //final String jsonStr = mGson.toJson(map);

        //整理url数据
        if (map!= null) {
            for (Map.Entry<String, String> entry : map.entrySet()) {
                key = entry.getKey();
                value = entry.getValue();
                text = text + "&" + (key + "=" + value);
            }
        }

        if (text.length()>0){
            text = text.substring(1,text.length());
            url= url+"?"+text;
        }


        final Request request = new Request.Builder().url(url)
                .get()
                .addHeader("AID","20170630062508d2ib32lBty95o5RS")
                .addHeader("APIVER","v1.0")
                .addHeader("ACCEPT","application/json")
                .build();

        mOKHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, final IOException e) {
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        callBack.onError(e);
                    }
                });
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {

                String str = response.body().string();
                final T result;
                //成功
                if (response.code() == 200) {

                    try {
                        result = mGson.fromJson(str, tClass);
                        mHandler.post(new Runnable() {
                            @Override
                            public void run() {
                                callBack.onSuccess(result);
                            }
                        });
                    } catch (final Throwable e) {
                        mHandler.post(new Runnable() {
                            @Override
                            public void run() {
                                callBack.onError(e);
                            }
                        });
                    }

                    //网址404的情况
                }else if (response.code() == 404){
                    callBack.onNotFound();
                }
                //返回错误信息的情况
                else {
                    JSONObject jsonObject = null;
                    try {

                        jsonObject = new JSONObject(str);
                        final String msg = jsonObject.getString("msg");
                        final String errorCode = jsonObject.getString("error_code");

                        Log.d("NewOkTool", msg);

                        mHandler.post(new Runnable() {
                            @Override
                            public void run() {

                                callBack.onDefMessage(errorCode,msg);
//                                if (("2002").equals(errorCode)||("2001").equals(errorCode)){
//                                    Utils.ShowTokenNewLogin(context);
//                                }else {
//                                    callBack.onDefMessage(errorCode,msg);
//                                }

                            }
                        });


                    } catch (JSONException e) {
                        e.printStackTrace();
                    }

                }
            }
        });

    }

    //Put请求
    @Override
    public <T> void putRequest(Context context, String url, Map<String, String> map, final Class<T> tClass, final CallBack<T> callBack) {

        //网络异常判断
        if (!Utils.checkNetworkAvailable(context)){
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    callBack.onNoNet();
                }
            });
            return;
        }

        String text = "1";
        String key,value;
        //发送Json数据
        //final String jsonStr = mGson.toJson(map);

        //向服务器不发送json  发送 文本
        if (map!= null) {
            for (Map.Entry<String, String> entry : map.entrySet()) {
                key = entry.getKey();
                value = entry.getValue();
                text = text + "&" + (key + "=" + value);
            }
        }

        RequestBody requestBody = RequestBody.create(TEXT,text);
        final Request request = new Request.Builder().url(url)
                .put(requestBody)
                .addHeader("AID","20170630062508d2ib32lBty95o5RS")
                .addHeader("APIVER","v1.0")
                .addHeader("ACCEPT","application/json")
                .build();
        mOKHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, final IOException e) {
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        callBack.onError(e);
                    }
                });
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {

                String str = response.body().string();
                final T result;
                //成功
                if (response.code() == 200) {

                    try {
                        result = mGson.fromJson(str, tClass);
                        mHandler.post(new Runnable() {
                            @Override
                            public void run() {
                                callBack.onSuccess(result);
                            }
                        });
                    } catch (final Throwable e) {
                        mHandler.post(new Runnable() {
                            @Override
                            public void run() {
                                callBack.onError(e);
                            }
                        });
                    }

                    //网址404的情况
                }else if (response.code() == 404){
                    callBack.onNotFound();
                }
                //返回错误信息的情况
                else {
                    JSONObject jsonObject = null;
                    try {

                        jsonObject = new JSONObject(str);
                        final String msg = jsonObject.getString("msg");
                        final String errorCode = jsonObject.getString("error_code");

                        Log.d("NewOkTool", msg);

                        mHandler.post(new Runnable() {
                            @Override
                            public void run() {

                                callBack.onDefMessage(errorCode,msg);
//                                if (("2002").equals(errorCode)||("2001").equals(errorCode)){
//                                    Utils.ShowTokenNewLogin(context);
//                                }else {
//                                    callBack.onDefMessage(errorCode,msg);
//                                }

                            }
                        });


                    } catch (JSONException e) {
                        e.printStackTrace();
                    }

                }
            }
        });

    }

    //Delete请求
    @Override
    public <T> void deleteRequest(Context context, String url, Map<String, String> map, final Class<T> tClass, final CallBack<T> callBack) {

        //网络异常判断
        if (!Utils.checkNetworkAvailable(context)){
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    callBack.onNoNet();
                }
            });
            return;
        }

        String text = "1";
        String key,value;
        //发送Json数据
        //final String jsonStr = mGson.toJson(map);

        //向服务器不发送json  发送 文本
        if (map!= null) {
            for (Map.Entry<String, String> entry : map.entrySet()) {
                key = entry.getKey();
                value = entry.getValue();
                text = text + "&" + (key + "=" + value);
            }
        }

        RequestBody requestBody = RequestBody.create(TEXT,text);
        final Request request = new Request.Builder().url(url)
                .delete(requestBody)
                .addHeader("AID","20170630062508d2ib32lBty95o5RS")
                .addHeader("APIVER","v1.0")
                .addHeader("ACCEPT","application/json")
                .build();
        mOKHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, final IOException e) {
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        callBack.onError(e);
                    }
                });
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {

                String str = response.body().string();
                final T result;
                //成功
                if (response.code() == 200) {

                    try {
                        result = mGson.fromJson(str, tClass);
                        mHandler.post(new Runnable() {
                            @Override
                            public void run() {
                                callBack.onSuccess(result);
                            }
                        });
                    } catch (final Throwable e) {
                        mHandler.post(new Runnable() {
                            @Override
                            public void run() {
                                callBack.onError(e);
                            }
                        });
                    }

                    //网址404的情况
                }else if (response.code() == 404){
                    callBack.onNotFound();
                }
                //返回错误信息的情况
                else {
                    JSONObject jsonObject = null;
                    try {

                        jsonObject = new JSONObject(str);
                        final String msg = jsonObject.getString("msg");
                        final String errorCode = jsonObject.getString("error_code");

                        Log.d("NewOkTool", msg);

                        mHandler.post(new Runnable() {
                            @Override
                            public void run() {

                                callBack.onDefMessage(errorCode,msg);
//                                if (("2002").equals(errorCode)||("2001").equals(errorCode)){
//                                    Utils.ShowTokenNewLogin(context);
//                                }else {
//                                    callBack.onDefMessage(errorCode,msg);
//                                }

                            }
                        });


                    } catch (JSONException e) {
                        e.printStackTrace();
                    }

                }
            }
        });

    }

    //直接返回Json数据
    @Override
    public void jsonRequest(Context context, String url, Map<String, String> map, final CallBack<String> callBack) {

        //网络异常判断
        if (!Utils.checkNetworkAvailable(context)){
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    callBack.onNoNet();

                }
            });
            return;
        }

        String text = "";
        String key,value;

        //整理url数据
        if (map!= null) {
            for (Map.Entry<String, String> entry : map.entrySet()) {
                key = entry.getKey();
                value = entry.getValue();
                text = text + "&" + (key + "=" + value);
            }
        }

        if (text.length()>0){
            text = text.substring(1,text.length());
            url= url+"?"+text;
        }


        final Request request = new Request.Builder().url(url)
                .get()
                .addHeader("AID","20170630062508d2ib32lBty95o5RS")
                .addHeader("APIVER","v1.0")
                .addHeader("ACCEPT","application/json")
                .build();
        mOKHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, final IOException e) {
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        callBack.onError(e);
                    }
                });
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {

                final String str = response.body().string();

                //成功
                if (response.code() == 200) {

                    try {

                        mHandler.post(new Runnable() {
                            @Override
                            public void run() {
                                callBack.onSuccess(str);
                            }
                        });
                    } catch (final Throwable e) {
                        mHandler.post(new Runnable() {
                            @Override
                            public void run() {
                                callBack.onError(e);
                            }
                        });
                    }

                    //网址404的情况
                }else if (response.code() == 404){
                    callBack.onNotFound();
                }
                //返回错误信息的情况
                else {
                    JSONObject jsonObject = null;
                    try {

                        jsonObject = new JSONObject(str);
                        final String msg = jsonObject.getString("msg");
                        final String errorCode = jsonObject.getString("error_code");

                        Log.d("NewOkTool", msg);

                        mHandler.post(new Runnable() {
                            @Override
                            public void run() {

                                callBack.onDefMessage(errorCode,msg);
//                                if (("2002").equals(errorCode)||("2001").equals(errorCode)){
//                                    Utils.ShowTokenNewLogin(context);
//                                }else {
//                                    callBack.onDefMessage(errorCode,msg);
//                                }

                            }
                        });


                    } catch (JSONException e) {
                        e.printStackTrace();
                    }

                }
            }
        });

    }

}
5.NetTool:
public class NetTool implements NetInterface {
    private static  NetTool sNetTool;
    private NetInterface mInterface;
    //双重校验锁(单例)
    public static NetTool getInstance(){
        if (sNetTool == null){
            synchronized (NetTool.class){
                if (sNetTool == null){
                    sNetTool = new NetTool();
                }
            }
        }
        return sNetTool;
    }

    private NetTool(){
        mInterface = new OKTool();
    }

    @Override
    public <T> void postRequest(Context context, String url, Map<String, String> map, Class<T> tClass, CallBack<T> callBack) {
        mInterface.postRequest(context,url,map,tClass,callBack);
    }

    @Override
    public <T> void getRequest(Context context, String url, Map<String, String> map, Class<T> tClass, CallBack<T> callBack) {
        mInterface.getRequest(context,url,map,tClass,callBack);
    }

    @Override
    public <T> void putRequest(Context context, String url, Map<String, String> map, Class<T> tClass, CallBack<T> callBack) {
        mInterface.putRequest(context,url,map,tClass,callBack);
    }

    @Override
    public <T> void deleteRequest(Context context, String url, Map<String, String> map, Class<T> tClass, CallBack<T> callBack) {
        mInterface.deleteRequest(context,url,map,tClass,callBack);
    }

    @Override
    public void jsonRequest(Context context, String url, Map<String, String> map, CallBack<String> callBack) {
        mInterface.jsonRequest(context,url,map,callBack);
    }

}
6.使用:
//Post
private void login() {

    String url = "http://ig.indata3.com/mice-api/user/company/login";
    String urlBad = "http://indata3.com/mice-api/user/company/login";

    HashMap map = new HashMap();
    map.put("mobilephone","18510063463");
    map.put("user_pwd","123");
    map.put("state_code","+86");

    NetTool.getInstance().postRequest(this, url, map, BeanLogin.class, new CallBack<BeanLogin>() {
        //获取数据成功
        @Override
        public void onSuccess(BeanLogin response) {
            Log.d("MainActivity","onSuccess:成功");
        
        //异常失败(后台数据库返回数据格式错误,无法映射成Bean)
        @Override
        public void onError(Throwable e) {
            Log.d("MainActivity","onError:失败");
        }
        //请求数据失败(得到返回码和错误信息)
        @Override
        public void onDefMessage(String code, String msg) {
            Log.d("MainActivity","onDefMessage_code:"+ code);
            Log.d("MainActivity","onDefMessage_msg:"+ msg);
        }
        //异常(网址错误等导致的404)
        @Override
        public void onNotFound() {
            Log.d("MainActivity","onNotFound:url404");
        }

        @Override
        public void onNoNet() {
            Log.d("MainActivity", "post网络异常");
        }
    });
}

关于检查网络连接:
public class Utils {

    //判断网络状态
    public static boolean checkNetworkAvailable(Context context) {

        ConnectivityManager connectivity = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connectivity == null) {
            return false;
        } else {
            NetworkInfo[] info = connectivity.getAllNetworkInfo();
            if (info != null) {
                for (int i = 0; i < info.length; i++) {
                    if (info[i].getState() == NetworkInfo.State.CONNECTED) {
                        NetworkInfo netWorkInfo = info[i];
                        if (netWorkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
                            return true;
                        } else if (netWorkInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
                            return true;
                        }
                    }
                }
            }
        }
        return false;
    }
}








  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
对于使用OkHttp进行封装,以下是一个基本的示例: 1. 首先,确保已经在项目添加了OkHttp的依赖。在build.gradle文件添加以下代码: ```groovy implementation 'com.squareup.okhttp3:okhttp:4.9.0' ``` 2. 创建一个HttpHelper类来封装OkHttp使用。示例代码如下: ```java import okhttp3.*; import java.io.IOException; public class HttpHelper { private final OkHttpClient client; public HttpHelper() { client = new OkHttpClient(); } public void get(String url, Callback callback) { Request request = new Request.Builder() .url(url) .build(); client.newCall(request).enqueue(callback); } public void post(String url, RequestBody requestBody, Callback callback) { Request request = new Request.Builder() .url(url) .post(requestBody) .build(); client.newCall(request).enqueue(callback); } } ``` 3. 现在可以在其他类使用HttpHelper进行网络请求。以下是一个使用GET请求的示例: ```java import okhttp3.Call; import okhttp3.Callback; import okhttp3.Response; import java.io.IOException; public class Main { public static void main(String[] args) { HttpHelper httpHelper = new HttpHelper(); String url = "https://api.example.com/data"; httpHelper.get(url, new Callback() { @Override public void onFailure(Call call, IOException e) { // 处理请求失败的情况 } @Override public void onResponse(Call call, Response response) throws IOException { // 处理请求成功的情况 String responseData = response.body().string(); System.out.println(responseData); } }); } } ``` 以上示例,我们首先创建了一个HttpHelper实例,然后使用get方法发送GET请求。在回调函数,可以处理请求成功或失败的情况,并处理返回的响应数据。 对于POST请求,可以使用post方法,并传递一个RequestBody对象作为请求体。具体的请求参数和请求头信息可以根据实际需求进行设置。 这只是一个基本的封装示例,你可以根据自己的项目需求进行更多的定制和扩展。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值