当前位置: 首页 > 工具软件 > OkHttpUtils > 使用案例 >

数据解析okgo okhttputils

卞昀
2023-12-01

okhttputils



import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.blankj.utilcode.util.ToastUtils;
import com.zhy.http.okhttp.callback.Callback;

import java.net.SocketException;
import java.net.SocketTimeoutException;

import cn.mvp.mlibs.log.LogUtils;
import okhttp3.Call;
import okhttp3.ResponseBody;


/**
 * ================================================
 * 作    者:M
 * 版    本:1.0
 * 创建日期:2021年12月22日 16:38:07
 * 描    述:默认将返回的数据解析成需要的Bean,可以是 BaseBean,String,List,Map
 * 修订历史:okhttputils解析数据
 * 逻辑:code为0时成功走onsuccess方法;非0时走onFailure方法并提示
 * ================================================
 */
public abstract class ResultCallback<T> extends Callback<BaseBean<T>> {

    public ResultCallback() {
    }

    @Override
    public BaseBean<T> parseNetworkResponse(okhttp3.Response response, int id) throws Exception {
        ResponseBody body = response.body();
        if (body != null) {
            try {
                String string = body.string();
                return JSONObject.parseObject(string, new TypeReference<BaseBean<T>>() {
                });
            } catch (Throwable throwable) {
                LogUtils.e(throwable.getMessage());
            }
        }
        return null;
    }

    @Override
    public void onError(Call call, Exception e, int id) {
        //记录一下错误日志
//        call.request().url()
        if (e instanceof SocketTimeoutException) {
            ToastUtils.showShort("请求超时");
        } else if (e instanceof SocketException) {
            ToastUtils.showShort("服务器异常");
        }
//        onError(call, e);
        LogUtils.e(e);
    }

    @Override
    public void onResponse(BaseBean<T> response, int id) {
        if (response.getCode() == 0) {
            onSuccess(response.getData());
        } else {
            //提示一下
            onFailure(response);
        }
    }

    public abstract void onSuccess(T data);

//    public abstract void onError(Call call, Exception e);

    public void onFailure(BaseBean<T> response) {
        //这里可以提示一下,写个toast.
        ToastUtils.showShort(response.getMsg());
    }

}

okgo



import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.blankj.utilcode.util.ToastUtils;
import com.lzy.okgo.callback.AbsCallback;
import com.orhanobut.logger.Logger;
import com.qmy.yzsw.bean.LoginBean;
import com.qmy.yzsw.bean.base.BaseBean;

import org.greenrobot.eventbus.EventBus;

import java.net.SocketException;
import java.net.SocketTimeoutException;

import cn.mvp.mlibs.log.LogUtils;
import okhttp3.Response;
import okhttp3.ResponseBody;

/**
 * ================================================
 * 作    者:M
 * 版    本:1.0
 * 创建日期:2021年12月22日 16:38:07
 * 描    述:默认将返回的数据解析成需要的Bean,可以是 BaseBean,String,List,Map
 * 修订历史:
 * 1.请求失败:提示异常原因;请求成功:解析异常会走onError方法,
 * 响应码(code)非正常值走onFailure()方法提示,可以通过重写决定是否提示
 * 修改时间2022年1月11日 11:18:23
 * ================================================
 */
public abstract class OkResultCallback<T> extends AbsCallback<BaseBean<T>> {

    public OkResultCallback() {
    }

    @Override
    public BaseBean<T> convertResponse(Response response) throws Throwable {
        ResponseBody body = response.body();
        if (body != null) {
            try {
                String string = body.string();
                return JSONObject.parseObject(string, new TypeReference<BaseBean<T>>() {
                });
            } catch (Throwable throwable) {
                LogUtils.e(throwable.getMessage());
                //抛出异常,走onError方法(解析异常)
                throw throwable;
            }
        }
        return null;
    }

    /**
     * 网络相关的异常
     * 请求失败,响应错误,数据解析错误等,都会回调该方法, UI线程
     */
    @Override
    public void onError(com.lzy.okgo.model.Response<BaseBean<T>> response) {
        super.onError(response);
        //记录一下错误日志
        if (response.code() == 404) {
            Logger.d("JsonCallback", "404 当前链接不存在");
            ToastUtils.showShort("404 当前链接不存在");
        }
        if (response.getException() instanceof SocketTimeoutException) {
            ToastUtils.showShort("请求超时");
        } else if (response.getException() instanceof SocketException) {
            ToastUtils.showShort("服务器异常");
        } else if (response.getException() instanceof RequestException) {
            BaseBean errorBean = ((RequestException) response.getException()).getErrorBean();
            if (errorBean.getCode() == 99) {
                EventBus.getDefault().post(new LoginBean());
            } else {
                ToastUtils.showShort(errorBean.getMsg());
            }
        } else {
            //解析异常及其他异常情况
            ToastUtils.showShort(response.getException().getMessage());
        }
        LogUtils.e(response.getException().getMessage());
    }


    @Override
    public void onSuccess(com.lzy.okgo.model.Response<BaseBean<T>> response) {
        if (response.isSuccessful()) {
            if (response.body().getCode() == 1) {
                onSuccess(response.body().getData());
            } else {
                //提示一下(响应体code非正常值情况下走此方法)
                onFailure(response.body());
            }
        } else {
            //提示一下?(此处为请求失败,应该不会走这里)
            onFailure(response.body());
        }
    }


    public abstract void onSuccess(T data);

    /**
     * 返回失败,响应json字符串里的code非正常值,主要用于提示消息
     * 可以重写,决定是否提示
     * 对应本项目即:code不等于1的情况下走这个方法
     */
    public void onFailure(BaseBean<T> response) {
        //这里可以提示一下,写个toast.
        ToastUtils.showShort(response.getMsg());
    }

}

参考

///*
// * Copyright 2016 jeasonlzy(廖子尧)
// *
// * Licensed under the Apache License, Version 2.0 (the "License");
// * you may not use this file except in compliance with the License.
// * You may obtain a copy of the License at
// *
// *      http://www.apache.org/licenses/LICENSE-2.0
// *
// * Unless required by applicable law or agreed to in writing, software
// * distributed under the License is distributed on an "AS IS" BASIS,
// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// * See the License for the specific language governing permissions and
// * limitations under the License.
// */

//
//import com.alibaba.fastjson.JSONObject;
//import com.alibaba.fastjson.TypeReference;
//import com.blankj.utilcode.util.SPUtils;
//import com.blankj.utilcode.util.ToastUtils;
//import com.lzy.okgo.callback.AbsCallback;
//import com.lzy.okgo.request.base.Request;
//import com.orhanobut.logger.Logger;
//import com.qmy.yzsw.bean.LoginBean;
//import com.qmy.yzsw.bean.base.BaseBean;
//import com.qmy.yzsw.config.Constants;
//
//import org.greenrobot.eventbus.EventBus;
//
//import java.lang.reflect.Type;
//import java.net.SocketException;
//import java.net.SocketTimeoutException;
//
//import okhttp3.Response;
//
///**
// * ================================================
// * 作    者:jeasonlzy(廖子尧)Github地址:https://github.com/jeasonlzy
// * 版    本:1.0
// * 创建日期:2016/1/14
// * 描    述:默认将返回的数据解析成需要的Bean,可以是 BaseBean,String,List,Map
// * 修订历史:
// * ================================================
// */
//public abstract class OkGoResultCallback<T> extends AbsCallback<BaseBean<T>> {
//
//    private Type type;
//    private Class<T> clazz;
//
//    public OkGoResultCallback() {
//    }
//
//    public OkGoResultCallback(Type type) {
//        this.type = type;
//    }
//
//    public OkGoResultCallback(Class<T> clazz) {
//        this.clazz = clazz;
//    }
//
//    @Override
//    public void onStart(Request<BaseBean<T>, ? extends Request> request) {
//        super.onStart(request);
//        // 主要用于在所有请求之前添加公共的请求头或请求参数
//        // 例如登录授权的 token
//        // 使用的设备信息
//        // 可以随意添加,也可以什么都不传
//        // 还可以在这里对所有的参数进行加密,均在这里实现
//        String token = SPUtils.getInstance().getString(Constants.SP_KEY_HEADER_TOKEN, "");
       HashMap<String, String> stringStringHashMap = new HashMap<>();
       stringStringHashMap.put("Authorization",token);
//        request.headers("Authorization", token);
        request.headers("header1", "HeaderValue1")//
                .params("params1", "ParamsValue1")//
                .params("token", "3215sdf13ad1f65asd4f3ads1f");
//    }
//
//    /**
//     * 该方法是子线程处理,不能做ui相关的工作
//     * 主要作用是解析网络返回的 response 对象,生产onSuccess回调中需要的数据对象
//     * 这里的解析工作不同的业务逻辑基本都不一样,所以需要自己实现,以下给出的时模板代码,实际使用根据需要修改
//     */
//    @Override
//    public BaseBean<T> convertResponse(Response response) throws Throwable {
//
//        // 重要的事情说三遍,不同的业务,这里的代码逻辑都不一样,如果你不修改,那么基本不可用
//        // 重要的事情说三遍,不同的业务,这里的代码逻辑都不一样,如果你不修改,那么基本不可用
//        // 重要的事情说三遍,不同的业务,这里的代码逻辑都不一样,如果你不修改,那么基本不可用
//
//        //详细自定义的原理和文档,看这里: https://github.com/jeasonlzy/okhttp-OkGo/wiki/JsonCallback
//
        if (type == null) {
            if (clazz == null) {
                Type genType = getClass().getGenericSuperclass();
                type = ((ParameterizedType) genType).getActualTypeArguments()[0];
            } else {
                JsonConvert1<T> convert = new JsonConvert1<>(clazz);
                return convert.convertResponse(response);
            }
        }

        JsonConvert1<T> convert = new JsonConvert1<>(type);
        return convert.convertResponse(response);
//        return JSONObject.parseObject(response.body().string(), new TypeReference<BaseBean<T>>() {
//        });
//    }
//
//    @Override
//    public void onSuccess(com.lzy.okgo.model.Response<BaseBean<T>> response) {
//        if (response.body().getCode() == 1) {
//            onSuccess(response.body().getData());
//        } else {
//            onFailure(response.body());
//        }
//    }
//
//    /**
//     * 返回失败,响应json字符串里的code非正常值,注意用于提示消息
//     * 可以重写,决定是否提示
//     */
//    private void onFailure(BaseBean<T> response) {
//        //提示一下
//        //        ToastUtils.showShort(response.getMsg());
//
//    }
//
//
//    /**
//     * 成功
//     */
//    protected abstract void onSuccess(T data);
//
//    /**
//     * 网络相关的异常
//     * 请求失败,响应错误,数据解析错误等,都会回调该方法, UI线程
//     */
//    @Override
//    public void onError(com.lzy.okgo.model.Response<BaseBean<T>> response) {
//        super.onError(response);
//        if (response.code() == 404) {
//            Logger.d("JsonCallback", "404 当前链接不存在");
//            ToastUtils.showShort("404 当前链接不存在");
//        }
//        if (response.getException() instanceof SocketTimeoutException) {
//            Logger.d("JsonCallback", "请求超时");
//            ToastUtils.showShort("请求超时");
//        } else if (response.getException() instanceof SocketException) {
//            Logger.d("JsonCallback", "服务器异常");
//            ToastUtils.showShort("服务器异常");
//        } else if (response.getException() instanceof RequestException) {
//            BaseBean errorBean = ((RequestException) response.getException()).getErrorBean();
//            if (errorBean.getCode() == 99) {
//                EventBus.getDefault().post(new LoginBean());
//            } else {
//                ToastUtils.showShort(errorBean.getMsg());
//            }
//
//        }
//    }
//}
///*
// * Copyright 2016 jeasonlzy(廖子尧)
// *
// * Licensed under the Apache License, Version 2.0 (the "License");
// * you may not use this file except in compliance with the License.
// * You may obtain a copy of the License at
// *
// *      http://www.apache.org/licenses/LICENSE-2.0
// *
// * Unless required by applicable law or agreed to in writing, software
// * distributed under the License is distributed on an "AS IS" BASIS,
// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// * See the License for the specific language governing permissions and
// * limitations under the License.
// */

//
//import com.google.gson.stream.JsonReader;
//import com.lzy.okgo.convert.Converter;
//import com.qmy.yzsw.bean.SimpleResponse;
//import com.qmy.yzsw.bean.base.BaseBean;
//import com.qmy.yzsw.utils.Convert;
//
//import java.lang.reflect.ParameterizedType;
//import java.lang.reflect.Type;
//
//import okhttp3.Response;
//import okhttp3.ResponseBody;
//
///**
// * ================================================
// * 作    者:jeasonlzy(廖子尧)Github地址:https://github.com/jeasonlzy
// * 版    本:1.0
// * 创建日期:16/9/11
// * 描    述:
// * 修订历史:
// * ================================================
// */
//public class JsonConvert1<T> implements Converter<BaseBean<T>> {
//
//    private Type type;
//    private Class<T> clazz;
//
//    public JsonConvert1() {
//    }
//
//    public JsonConvert1(Type type) {
//        this.type = type;
//    }
//
//    public JsonConvert1(Class<T> clazz) {
//        this.clazz = clazz;
//    }
//
//    /**
//     * 该方法是子线程处理,不能做ui相关的工作
//     * 主要作用是解析网络返回的 response 对象,生成onSuccess回调中需要的数据对象
//     * 这里的解析工作不同的业务逻辑基本都不一样,所以需要自己实现,以下给出的时模板代码,实际使用根据需要修改
//     */
//    @Override
//    public BaseBean<T> convertResponse(Response response) throws Throwable {
//        // 重要的事情说三遍,不同的业务,这里的代码逻辑都不一样,如果你不修改,那么基本不可用
//        // 重要的事情说三遍,不同的业务,这里的代码逻辑都不一样,如果你不修改,那么基本不可用
//        // 重要的事情说三遍,不同的业务,这里的代码逻辑都不一样,如果你不修改,那么基本不可用
//
//        // 如果你对这里的代码原理不清楚,可以看这里的详细原理说明: https://github.com/jeasonlzy/okhttp-OkGo/wiki/JsonCallback
//        // 如果你对这里的代码原理不清楚,可以看这里的详细原理说明: https://github.com/jeasonlzy/okhttp-OkGo/wiki/JsonCallback
//        // 如果你对这里的代码原理不清楚,可以看这里的详细原理说明: https://github.com/jeasonlzy/okhttp-OkGo/wiki/JsonCallback
//        if (type == null) {
//            if (clazz == null) {
//                // 如果没有通过构造函数传进来,就自动解析父类泛型的真实类型(有局限性,继承后就无法解析到)
//                Type genType = getClass().getGenericSuperclass();
//                type = ((ParameterizedType) genType).getActualTypeArguments()[0];
//            } else {
//                return parseClass(response, clazz);
//            }
//        }
//
//        if (type instanceof ParameterizedType) {
//            return parseParameterizedType(response, (ParameterizedType) type);
//        } else if (type instanceof Class) {
//            return parseClass(response, (Class<?>) type);
//        } else {
//            return parseType(response, type);
//        }
//    }
//
//    private BaseBean<T> parseClass(Response response, Class<?> rawType) throws Exception {
//        if (rawType == null) return null;
//        ResponseBody body = response.body();
//        if (body == null) return null;
//        JsonReader jsonReader = new JsonReader(body.charStream());
//
//        /*if (rawType == String.class) {
//            //noinspection unchecked
//            return (BaseBean<T>) body.string();
//        } else if (rawType == JSONObject.class) {
//            //noinspection unchecked
//            return (BaseBean<T>) new JSONObject(body.string());
//        } else if (rawType == JSONArray.class) {
//            //noinspection unchecked
//            return (BaseBean<T>) new JSONArray(body.string());
//        } else */if (rawType == BaseBean.class) {
//            // 泛型格式如下: new JsonCallback<LzyResponse<内层JavaBean>>(this)
//            BaseBean lzyResponse = Convert.fromJson(jsonReader, type);
//            response.close();
//            int code = lzyResponse.getCode();
//            String msg = lzyResponse.getMsg();
//            if (code == 1) {
//                return (BaseBean<T>) lzyResponse;
//            } else {
//                throw new RequestException("{\"code\":" + code + ",\"msg\":\"" + msg + "\"}");
//            }
//        } else {
//            BaseBean<T> t = Convert.fromJson(jsonReader, rawType);
//            response.close();
//            return t;
//
//        }
//    }
//
//    private BaseBean<T> parseType(Response response, Type type) throws Exception {
//        if (type == null) return null;
//        ResponseBody body = response.body();
//        if (body == null) return null;
//        JsonReader jsonReader = new JsonReader(body.charStream());
//
//        // 泛型格式如下: new JsonCallback<任意JavaBean>(this)
//        BaseBean<T> t = Convert.fromJson(jsonReader, type);
//        response.close();
//        return t;
//    }
//
//    private BaseBean<T> parseParameterizedType(Response response, ParameterizedType type) throws Exception {
//        if (type == null) return null;
//        ResponseBody body = response.body();
//        if (body == null) return null;
//        JsonReader jsonReader = new JsonReader(body.charStream());
//        Type rawType = type.getRawType();                     // 泛型的实际类型
//        Type typeArgument = type.getActualTypeArguments()[0]; // 泛型的参数
//        if (rawType != BaseBean.class) {
//            // 泛型格式如下: new JsonCallback<外层BaseBean<内层JavaBean>>(this)
//            BaseBean<T> t = Convert.fromJson(jsonReader, type);
//            response.close();
//            return t;
//        } else {
//            if (typeArgument == Void.class) {
//                // 泛型格式如下: new JsonCallback<LzyResponse<Void>>(this)
//                SimpleResponse simpleResponse = Convert.fromJson(jsonReader, SimpleResponse.class);
//                response.close();
//                //noinspection unchecked
//                return (BaseBean<T>) simpleResponse.toLzyResponse();
//            } else {
//                // 泛型格式如下: new JsonCallback<LzyResponse<内层JavaBean>>(this)
//                BaseBean lzyResponse = Convert.fromJson(jsonReader, type);
//                response.close();
//                int code = lzyResponse.code;
//                String msg = lzyResponse.msg;
//                if (code == 1) {
//                    return (BaseBean<T>) lzyResponse;
//                } else {
//                    throw new RequestException("{\"code\":" + code + ",\"msg\":\"" + msg + "\"}");
//                }
//            }
//        }
//    }
//}

 类似资料: