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 + "\"}");
// }
// }
// }
// }
//}