搭建这个简单网络请求框架可以大概分为以下步骤:
基础准备;
创建接口类;
创建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 网络请求搭建了。如果我的文章对看官有所帮助,不妨点个赞!