OkHttpManager.java 12.1 KB
package com.chudiangameplay.android.manager;

import android.content.Context;
import android.text.TextUtils;

import com.chudiangameplay.android.bean.ClientInfo;
import com.chudiangameplay.android.bean.ErrCodeResponse;
import com.chudiangameplay.android.event.Event_RoomManage_Change;
import com.chudiangameplay.android.exception.GatewayTimeoutException;
import com.chudiangameplay.android.interface_.OkHttpCallBack;
import com.chudiangameplay.android.responce.BaseResponce;
import com.chudiangameplay.android.tool.Log;
import com.chudiangameplay.android.util.NetUtils;
import com.chudiangameplay.android.util.Util;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.callback.AbsCallback;
import com.lzy.okgo.model.HttpMethod;
import com.lzy.okgo.model.Response;
import com.lzy.okgo.request.base.BodyRequest;
import com.lzy.okgo.request.base.Request;
import com.tencent.bugly.crashreport.CrashReport;

import org.greenrobot.eventbus.EventBus;

import java.io.File;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import okhttp3.FormBody;

/**
 * Created by Administrator on 2018/8/13.
 */

public class OkHttpManager {

    private static final int GATEWAY_TIMEOUT = 504;
    /**
     * okHttp请求, 外部调用
     *
     * @param tag           请求的tag,用于取消请求
     * @param context       上下文,用于取消请求
     * @param methed        请求类型 (HttpMethod.POST/HttpMethod.GET)
     * @param url           请求地址
     * @param requestBody   post方式 放入请求体的参数
     * @param responseClass 返回responce类型 (自动解析json)
     * @param callBack      回调对象
     */
    public static void okHttpRequest(String tag, Context context, HttpMethod methed, String url, Map<String, String> requestBody, Class<? extends BaseResponce> responseClass, OkHttpCallBack callBack, Map<String, String>... header) {
        if (!url.contains("?")) {
            //添加客户端参数
            Map<String, String> map = Util.getFieldMap(new ClientInfo());
            String urlParam = "";
            for (String key : map.keySet()) {
                urlParam += key + "=" + URLEncoder.encode(map.get(key)) + "&";
            }
            url += "?" + urlParam;
        }

        //headers参数
        Map<String, String> headers = new HashMap<>();
        if (header.length > 0) {
            headers = header[0];
        }
        if (UserManager.isLogin(context)) {
            headers.put("token", UserManager.getToken(context));
        }
        executeByOkHttp(methed, context, url, requestBody, headers, responseClass, callBack, tag);
    }

    public static void okHttpRequest(Context context, HttpMethod methed, String url, Map<String, String> requestBody, Class<? extends BaseResponce> responseClass, OkHttpCallBack callBack, Map<String, String>... header) {
        okHttpRequest(null, context, methed, url, requestBody, responseClass, callBack, header);
    }

    //文件上传
    public static void okHttpFileUpload(Context context, HttpMethod methed, String url, Map<String, String> headers, String filekeyName, List<File> files, Class<? extends BaseResponce> responseClass, OkHttpCallBack callBack) {
        if (!url.contains("?")) {
            //添加客户端参数
            Map<String, String> map = Util.getFieldMap(new ClientInfo());
            String urlParam = "";
            for (String key : map.keySet()) {
                urlParam += key + "=" + URLEncoder.encode(map.get(key)) + "&";
            }
            url += "?" + urlParam;
        }

        //headers参数
        if (headers == null) {
            headers = new HashMap<>();
        }
        if (UserManager.isLogin(context)) {
            headers.put("token", UserManager.getToken(context));
        }
        uploadByOkhttp(context, url, headers, responseClass, files, callBack);
    }

    private static void uploadByOkhttp(final Context context, final String url, Map<String, String> headers, final Class<? extends BaseResponce> responseClass, List<File> files, final OkHttpCallBack callBack) {
        BodyRequest request = OkGo.post(url);
        if (files != null) {
            request.addFileParams("file", files);
            request.client(NetUtils.getUploadHttpBuild(context));
        }

        //添加headers
        if (headers != null && headers.size() > 0) {
            for (String key : headers.keySet()) {
                String value = headers.get(key);
                request.getHeaders().put(key, value);
            }
        }

        request.execute(new AbsCallback<BaseResponce>() {
            @Override
            public BaseResponce convertResponse(okhttp3.Response response) throws Throwable {
                //子线程
                BaseResponce object = null;
                try {
                    String s = response.body().string();
                    Log.i("result:" + s);
                    if (responseClass != null) {
                        object = new Gson().fromJson(s, responseClass);
                    }
//                        else {
//                            object = new BaseResponce();
//                            object.code = "10000";
//                        }
//                        object.result = s;
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return object;
            }

            @Override
            public void onSuccess(Response<BaseResponce> response) {
                if (callBack == null) return;
                BaseResponce baseResponce = response.body();
                //UI线程
                if (baseResponce == null)  //数据解析失败
                {
                    callBack.onFailure(baseResponce);
                } else {           //数据解析成功
                    callBack.onSuccess(baseResponce);
//                        if ("200".equals(baseResponce.status)) {
//                            callBack.onSuccess(baseResponce);
//                        } else {
//                            callBack.onFailure(baseResponce);
//                        }
                }
            }

            @Override
            public void onError(Response<BaseResponce> response) {
                super.onError(response);
                if (callBack != null) {
                    callBack.onFailure(null);
                }
            }
        });

    }

    private static void executeByOkHttp(HttpMethod methed, final Context context, final String url, Map<String, String> requestBody, Map<String, String> headers, final Class<? extends BaseResponce> responseClass, final OkHttpCallBack callBack) {
        executeByOkHttp(methed, context, url, requestBody, headers, responseClass, callBack, null);
    }

    private static void executeByOkHttp(HttpMethod methed, final Context context, final String url, Map<String, String> requestBody, Map<String, String> headers, final Class<? extends BaseResponce> responseClass, final OkHttpCallBack callBack,
                                        String tag) {
        try {
            Request request = null;
            //添加body
            FormBody.Builder builder = new FormBody.Builder();
            if (requestBody != null) {
                for (String key : requestBody.keySet()) {
                    String value = requestBody.get(key);
                    if (value != null) {
                        builder.add(key, value);
                    }
                }
            }
            FormBody body = builder.build();
            if (HttpMethod.POST == methed) {
                if (TextUtils.isEmpty(tag)) {
                    request = OkGo.post(url).tag(context).upRequestBody(body);
                } else {
                    request = OkGo.post(url).tag(tag).upRequestBody(body);
                }
            } else {
                if (TextUtils.isEmpty(tag)) {
                    request = OkGo.get(url).tag(context);
                } else {
                    request = OkGo.get(url).tag(tag);
                }
            }

            //添加headers
            if (headers != null && headers.size() > 0) {
                for (String key : headers.keySet()) {
                    String value = headers.get(key);
                    request.getHeaders().put(key, value);
                }
            }

            final Request finalRequest = request;
            request.execute(new AbsCallback<BaseResponce>() {
                @Override
                public BaseResponce convertResponse(okhttp3.Response response) throws Throwable {
                    //子线程
                    BaseResponce object = null;
                    String s = response.body().string();

                    Log.i(finalRequest.getBaseUrl());
                    Log.i(s);

                    if (responseClass != null) {
                        try {
                            object = new Gson().fromJson(s, responseClass);
                        } catch (Exception e) {
                            e.printStackTrace();
                            object = new Gson().fromJson(s, BaseResponce.class);
                        }
                    } else {
                        object = new BaseResponce();
                        object.status = BaseResponce.Status_Success;

                    }
                    object.result = s;
                    if (TextUtils.equals("500", object.status)) {
                        //50026
                        try {
                            ErrCodeResponse json = new Gson().fromJson(s, ErrCodeResponse.class);
                            if (json != null && json.data != null) {
                                if (TextUtils.equals(json.data.errcode, "50003") || TextUtils.equals(json.data.errcode, "50026")) {
                                    Event_RoomManage_Change eventRoomRoleChange = new Event_RoomManage_Change();
                                    eventRoomRoleChange.type = "聊天室关闭";
                                    EventBus.getDefault().post(eventRoomRoleChange);
                                }
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    return object;
                }

                @Override
                public void onSuccess(Response<BaseResponce> response) {
                    BaseResponce baseResponce = response.body();
                    //UI线程
                    if (baseResponce == null)  //数据解析失败
                    {
                        if (callBack != null) {
                            callBack.onFailure(baseResponce);
                        }
                    } else {           //数据解析成功
                        if ("501".equals(baseResponce.status)) {   //未登录,跳登录
                            UserManager.logout1(context);
                            UserManager.showLogin(context);
                        }
                        if (callBack != null) {
                            callBack.onSuccess(baseResponce);
                        }
                    }
                }

                @Override
                public void onError(Response<BaseResponce> response) {
                    super.onError(response);
                    if (callBack != null) {
                        BaseResponce baseResponce = new BaseResponce();
                        baseResponce.status = response.code() + "";
                        baseResponce.msg = response.message();
                        callBack.onFailure(baseResponce);
                    }
                    reportError(response.code(), context);
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
            if (callBack != null) {
                callBack.onFailure(null);
            }
        }
    }

    private static void reportError(int code, Context context){
        if(code == GATEWAY_TIMEOUT){
            CrashReport.postCatchedException(new GatewayTimeoutException(new ClientInfo().toString()));
            NetDiagnosis.getInstance().startDiagnose(context);
        }
    }
}