okhttp解析请求响应字符串为实体,泛型,fastjson

请求回调解析 ResultCallback



import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.blankj.utilcode.util.ToastUtils;
import com.qmy.yzsw.bean.base.BaseBean;
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;

/**
 * ================================================
 * 作    者:胡一帆
 * 版    本:1.0
 * 创建日期:2021年12月22日 16:38:07
 * 描    述:默认将返回的数据解析成需要的Bean,可以是 BaseBean,String,List,Map
 * 修订历史:
 * ================================================
 */
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) {
        LogUtils.e("响应成功");
        if (response == null) {
            LogUtils.e("解析后的数据为空");
            return;
        }
        if (response.getCode() == 1) {
            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());
    }

}

ben类 

import java.io.Serializable;

public class BaseBean<T> implements Serializable {
    public int code;
    public T data;
    public String msg;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

使用

OkHttpUtils.post().url(Urls.LOGIN)
                .addParams("userName", "胡一帆")
                .addParams("password", "cccccc")
                .build().execute(new ResultCallback<LoginEntity.DataBean>() {
            @Override
            public void onSuccess(LoginEntity.DataBean data) {
                LogUtils.e("调用成功....");
            }

            @Override
            public void onError(Call call, Exception e) {
                LogUtils.e("异常....");

            }

            @Override
            public void onFailure(BaseBean<LoginEntity.DataBean> response) {
//                super.onFailure(response);
//                LogUtils.e("++++++++++ "+response.getMsg());
            }
        });

okGo解析


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 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 JsonCallback1<T> extends AbsCallback<BaseBean<T>> {

    private Type type;
    private Class<T> clazz;

    public JsonCallback1() {
    }

    public JsonCallback1(Type type) {
        this.type = type;
    }

    public JsonCallback1(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());
        }

    }

    /**
     * 失败
     */
    private void onFailure(BaseBean<T> response) {

    }

    /**
     * 成功
     */
    protected abstract void onSuccess(T data);

    @Override
    public void onError(com.lzy.okgo.model.Response<BaseBean<T>> response) {
        super.onError(response);
        int code = response.code();
        if (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());
            }

        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值