Retrofit2配合RxJava实现网络请求并简易封装

搭建这个简单网络请求框架可以大概分为以下步骤:

基础准备;

创建接口类;

创建OkHttp3实例;

创建retrofit实例;

创建调用器,将Java接口修改为HTTP调用;

封装回调观察者,统一处理错误信息。

 第一步的基础准备自然就是添加需要的依赖了,根据版本自己选择,通常使用最新版:

implementation 'io.reactivex.rxjava2:rxjava:2.0.8'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
//Retrofit2
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
//Retrofit 支持Rxjava 的支持库
implementation 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
//gson 解析器
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
//okhttp日志拦截器
implementation 'com.squareup.okhttp3:logging-interceptor:3.3.0'

创建请求接口,里面定义自己请求的url,包括参数,返回的对象类型。如下示:有两个请求方法,分别是GET请求跟POST请求,因为要结合RxJava,所以接收对象是Observable。不想使用RxJava就用Call就好了。

interface Api {

    @GET("{url")
    Observable<ResponseBody> getPathData(@Path("mobile") String mobile);

    @POST("url")
    Observable<ResponseBody> getUser(@Field("id") String id,
                               @Field("address") String address,
                               @Field("mobile") String mobile);
    @POST("url")
    Call<ResponseBody> getUser(@Field("id") String id);
}

 这里拓展一下,接收对象ResponseBody是Ok3里面的默认返回相应体,这个是可以修改的。通常情况会根据请求返回生成的数据Bean。数据Bean也可以二次封装,提出一个通用部分的Bean,可以根据个人习惯或者后台同事返回来定义,举个栗子:

public class BaseBody<T> {
    private String msg;
    private int code; 
    private T data;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = 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;
    }
}

于是接口类就成了这样:

@GET("{url")
Observable<BaseBody<User>> getPathData(@Path("mobile") String mobile);

创建Ok实例:

OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.connectTimeout(3000, TimeUnit.SECONDS);//连接超时
builder.writeTimeout(3000, TimeUnit.SECONDS);//写入超时
builder.readTimeout(3000, TimeUnit.SECONDS);//读取超时
builder.retryOnConnectionFailure(true);//错误重连
//日志拦截器
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
builder.addInterceptor(loggingInterceptor);
//请求头拦截器
Interceptor header = new Interceptor() {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request.Builder builder = chain.request().newBuilder();
        builder.addHeader("token", "token");
        builder.addHeader("Cookie", "cookie");
        builder.addHeader("其他属性", "其他值");
        return chain.proceed(builder.build());
    }
};
builder.addInterceptor(header);
OkHttpClient client = builder.build(); 

 这里提一下关于拦截器。拦截器分为应用拦截器跟网络拦截器,区别各有不同有兴趣的可以查看下其他优秀的拦截器文章介绍

 创建retrofit实例:

Retrofit retrofit =   new Retrofit.Builder()
        .baseUrl("自己的url")
        .client(HttpClientBuilder.getOkHttpInstance())
        // 支持RxJava平台
        //compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
        //解析器
        .addConverterFactory(GsonConverterFactory.create())
        .build();

所谓调用器其实就是一个类,里面有一个调用方法,请求接口,拿到数据。

HttpClientBuilder.getRetrofitInstance()
        .create(Api.class)
        .getUser2("10086")
        .subscribeOn(Schedulers.io())
        .unsubscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Observer<ResponseBody>() {
            @Override
            public void onSubscribe(Disposable d) {
            }
            @Override
            public void onNext(ResponseBody responseBody) {
               //do something 
            }
            @Override
            public void onError(Throwable e) {
            }
            @Override
            public void onComplete() {
            }
        });

以上就是一个粗糙又简单的retrofit + OkHttp + RxJava 网络请求搭建了。如果我的文章对看官有所帮助,不妨点个赞!

发布了46 篇原创文章 · 获赞 15 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/FooTyzZ/article/details/84136299