上一篇文章讲解了Retrofit基础实例,接下来对它进行框架的封装,让调用更加的简单,高效。请看一下工程的结构。
一、首先NetKitCallBack中定义了回调的接口包含成功,警告以及错误的提示
public void success(T data);
public void warning(T data, Integer status, @NonNull String message, String messageLevel);
public void error(Throwable t);
二、然后在ResultData中定义的是本公司接口返回数据的标准格式,这个大家需要依照各公司返回格式而定。
public class ResultData<T> {
/**
* status : 3200
* data : {}
* message : {"message":"","messageLevel":""}
*/
}
三、然后在OkHttpUtil类中定义了一些请求网络时设置连接超时,token,头信息等数据,因为retrofit的封装基于okhttp实现的。
class OkHttpUtil {
private static OkHttpClient client;
OkHttpUtil(int connectTimeOut, int writeTimeOut, int readTimeOut, final String stokenkey, final String tid) {
OkHttpClient.Builder builder = new OkHttpClient.Builder()
.connectTimeout(connectTimeOut, TimeUnit.SECONDS)
.writeTimeout(writeTimeOut, TimeUnit.SECONDS)
.readTimeout(readTimeOut, TimeUnit.SECONDS);
if (stokenkey != null && !stokenkey.equals("")) {
builder.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
// 头信息添加stokenkey
Request request = chain.request();
Request.Builder builder1 = request.newBuilder();
Request build = builder1.addHeader("st", stokenkey).addHeader("tid", tid).build();
return chain.proceed(build);
}
});
}
builder.addNetworkInterceptor(new StethoInterceptor());
client = builder.build();
}
OkHttpClient getClient() {
return client;
}
}
四、NetKit类中实例化retrofit,在回调中处理服务器返回的信息
public static NetKit getInstance() {
if (instance == null) {
synchronized (NetKit.class) {
if (instance == null) {
instance = new NetKit();
}
}
}
return instance;
}
/**
* 通用于没有返回接口数据格式
* @param call call
* @param callBack callBack
* @return 返回值为null
*/
public <T> T actionWithoutRestJson(Call<T> call, final
NetKitCallBack<T> callBack) {
call.enqueue(new Callback<T>() {
@Override
public void onResponse(Call<T> call, Response<T> response) {
T resultData = response.body();
if (resultData == null) {
int code = response.code();
switch (code) {
case 404:
callBack.warning(null, code, "目标文件不存在", null);
break;
case 500:
callBack.warning(null, code, "服务器出错,请联系管理员", null);
break;
case 502:
callBack.warning(null, code, "服务无法连接,请联系管理员", null);
break;
case 503:
callBack.warning(null, code, "服务器由于维护或者负载过重未能应答", null);
break;
default:
callBack.warning(null, code, "未知错误", null);
break;
}
return;
}
callBack.success(resultData);
}
@Override
public void onFailure(Call<T> call, Throwable e) {
String error = "";
if (e instanceof TimeoutException || e instanceof SocketTimeoutException
|| e instanceof ConnectException || e instanceof UnknownHostException) {
error = "连接超时,请检查网络连接";
} else if (e instanceof JsonSyntaxException) {
error = "返回Json格式出错";
//假如导致这个异常触发的原因是服务器的问题,那么应该让服务器知道,所以可以在这里
//选择上传原始异常描述信息给服务器
}
if (error.equals(""))
callBack.error(e);
else callBack.warning(null, 0, error, null);
}
});
return null;
}
五、定义业务逻辑接口
public interface LogInterface {
/**
* 定义了一个获取用户信息的业务方法,并且通过注解的方式
* 指定了方法调用的时候所请求的url路径
*/
@GET("test")
Call<UserInfo> getUserInfo();
//动态路径替换使用型参替换
@GET("test/{a}")
Call<UserInfo> test(@Path("a")String params, String p1);
//使用Query注解替换?后面的参数
@GET("test/search")
Call<UserInfo> search(@Query("keyword") String params, @Query("sort") String p1);
//使用QueryMap注解替换?后面的多个参数
//最终会将map中的所有key/value拼接到url的?后面
@GET("test/search")
Call<UserInfo> search1 (@QueryMap HashMap<String,String > map);
//登录的业务方法
//使用@Field设置请求体参数
@FormUrlEncoded //配置队请求体参数进行url编码
@POST("login")
Call<User> login(@Field("username") String p1, @Field("password")String p2);
}
6、根据封装的框架进行调用解析数据
anInterface = NetKit.getInstance().createInterface(url, LogInterface.class);
NetKit.getInstance().actionWithoutRestJson(anInterface.getUserInfo(), new NetKitCallBack<LogInterface.UserInfo>() {
@Override
public void success(LogInterface.UserInfo userInfo) {
tv.setText(userInfo.toString());
}
@Override
public void warning(LogInterface.UserInfo data, Integer status, @NonNull String message, String messageLevel) {}
@Override
public void error(Throwable t) {}
});
七、总结
至此封装Retrofit后调用逻辑已经完成了,更多的各种注解形式的调用大家在项目中可以看到,借助tomcat开启服务,将apitest.war文件放到tomcat的此路径下 D:\download\apache-tomcat-8.0.33\webapps,再点击startup.bat双击打开即可调试运行数据。此demo下载路径:https://download.csdn.net/download/lou_liang/10784966