关于RetrofitUtil网络框架封装,让你事半功倍

上一篇文章讲解了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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值