Okhttp3+Retrofit2+RxJava2的封装和使⽤Retrofit注解使⽤1、介绍
Retrofit:Retrofit是Square公司开发的⼀款针对Android ⽹络请求的框架(底层默认是基于OkHttp 实现)。
OkHttp:也是Square公司的⼀款开源的⽹络请求库。
RxJava :"a library for composing asynchronous and event-based programs using observable sequences for the Java VM"(⼀个在 Java VM 上使⽤可观测的序列来组成异步的、基于事件的程序的库)。RxJava使异步操作变得⾮常简单。
Retrofit 负责 请求的数据 和 请求的结果,使⽤ 接⼝的⽅式 呈现,OkHttp 负责请求的过程,RxJava 负责异步,各种线程之间的切换。
2、封装使⽤
添加依赖库
1    //⽹络请求okhttp3
2    implementation 'com.squareup.okhttp3:okhttp:3.12.0'
3    //⽇志的
4    implementation 'com.squareup.okhttp3:logging-interceptor:3.6.0'
5    //Retrofit2库
6    implementation 'fit2:retrofit:2.3.0'
7    implementation 'fit2:adapter-rxjava2:2.3.0'
8    //gson解析
9    implementation 'fit2:converter-gson:2.3.0'
10    //rxjava2库
11    implementation 'java2:rxjava:2.0.1'
12    implementation 'java2:rxandroid:2.0.1'
创建RetrofitHelper类:这个类属于⽹络请求⼯具类,⽤于初始化Retrofit,okhttp连接的⼀些设置,设
置请求API的baseUrl、gson解析⽅式等。还有通过接⼝对象,调⽤接⼝类中的⽅法也写在这个⾥⾯了。
1package khttp;
2
3import android.util.Log;
4
le.gson.JsonObject;
6
7import java.util.Map;
8import urrent.TimeUnit;
9
activex.Observable;
11import okhttp3.OkHttpClient;
12import okhttp3.logging.HttpLoggingInterceptor;
13import retrofit2.Retrofit;
14import java2.RxJava2CallAdapterFactory;
verter.gson.GsonConverterFactory;
16
17/**
18 * Created by wjy.
19 * Date: 2019/11/22
20 * Time: 9:45
21 * Describe: Retrofit⽹络请求⼯具类,⽤于初始化Retrofit,设置请求API的baseUrl、gson解析⽅式
22 */
23public class RetrofitHelper {
24
25    private static RetrofitHelper instance = null;
26    private static OkHttpClient okHttpClient;
27    private ApiService apiService;
28
29    public RetrofitHelper(OkHttpClient okHttpClient){
29    public RetrofitHelper(OkHttpClient okHttpClient){
30        Retrofit retrofit = new Retrofit.Builder()
31                .baseUrl(ApiService.BASE_URL)//服务器地址
32                .ate())//⽤Gson把服务端返回的json数据解析成实体
33                .ate())
34                .client(okHttpClient)
35                .build();//⽣成⼀个Retrofit实例
36        apiService = ate(ApiService.class);//传⼊⽹络接⼝类,得到接⼝对象实例,调⽤接⼝类中的⽅法。
37    }
38
39    public static RetrofitHelper getInstance(){
40        if (instance == null){
41            instance = new RetrofitHelper(getOkhttpClient());
42        }
43        return instance;
44    }
45
46    //okhttp连接的⼀些设置
47    public static OkHttpClient getOkhttpClient(){
48        okHttpClient = new OkHttpClient.Builder()
49                .connectTimeout(20, TimeUnit.SECONDS)//连接超时时间
50                .readTimeout(20,TimeUnit.SECONDS)//读超时时间
51                .writeTimeout(20,TimeUnit.SECONDS)//写超时时间
52                .retryOnConnectionFailure(true)//失败重连
53                .addInterceptor(loggingInterceptor)
54//                .addInterceptor()//设置
55                .build();
56        return okHttpClient;
57    }
58
59    //⽇志
60    static HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
61        @Override
62        public void log(String message) {
63            //打印retrofit⽇志
64            Log.e("RetrofitLog", "retrofitBack = " + message);
65        }
66    });
67    //⽇志等级
68
69    //=========================以下是通过接⼝对象,调⽤接⼝类中的⽅法================================// 70
71    public Observable<JsonObject> requestData(String url){
72        questData(url);
73    }
74
75    public Observable<JsonObject> requestLogin_get(String username,String pwd,String regid){
76        questLogin_get(username,pwd,regid);
77    }
78
79    public Observable<JsonObject> requestLogin_post(String username,String pwd,String regid){
80        questLogin_post(username,pwd,regid);
81    }
82
83    public Observable<JsonObject> requestLogin_get_map(Map<String,String> params){
84        questLogin_get_map(params);
85    }
86
87    public Observable<JsonObject> requestLogin_post_map(Map<String,String> params){
88        questLogin_post_map(params);
89    }
90
91    public Observable<JsonObject> requestLogin_post_body(ApiService.LoginInfo loginInfo){
92        questLogin_post_body(loginInfo);
93    }
94
94
95    public Observable<JsonObject> requestLogin_get_http(String username,String pwd,String regid){
96        questLogin_get_http(username,pwd,regid);
97    }
98
99    public Observable<JsonObject> requestLogin_post_http(String username,String pwd,String regid){
100        questLogin_post_http(username,pwd,regid);
101    }
102
103    public Observable<JsonObject> uploadImage(String tp,String code){
104        return apiService.uploadImage(tp,code);
105    }
106
107}
定义接⼝:管理Retrofit的各种数据请求(post、get),包含请求api、请求参数,Retrofit 注解使⽤等。
1package khttp;
2
le.gson.JsonObject;
4
5import flect.Type;
6import java.util.List;
7import java.util.Map;
8
activex.Observable;
10
11import okhttp3.MultipartBody;
12import okhttp3.RequestBody;
13import okhttp3.ResponseBody;
14import retrofit2.Call;
15import retrofit2.http.Body;
android retrofit16import retrofit2.http.Field;
17import retrofit2.http.FieldMap;
18import retrofit2.http.FormUrlEncoded;
19import retrofit2.http.GET;
20import retrofit2.http.HTTP;
21import retrofit2.http.Headers;
22import retrofit2.http.Multipart;
23import retrofit2.http.POST;
24import retrofit2.http.Part;
25import retrofit2.http.PartMap;
26import retrofit2.http.Path;
27import retrofit2.http.Query;
28import retrofit2.http.QueryMap;
29import retrofit2.http.Streaming;
30import retrofit2.http.Url;
31
32/**
33 * Created by wjy.
34 * Date: 2019/11/22
35 * Time: 11:42
36 * Describe: 定义接⼝:管理Retrofit的各种数据请求(post、get),包含请求api、请求参数
37 */
38public interface ApiService {
39
40    String BASE_URL = "xxxxxxxxxx/";//服务器地址
41
42    //Observable<JsonObject>  中的JsonObject可以换成对应的实体类
43
44    /**
45    * GET后⾯的url中可以使⽤⾃定义的变量,如 {index}、{id}进⾏占位,并使⽤ @Path("index") 、@Path("id") 注解为 {index} 、{id} 提供值
46    * 注意:形如“?page/xxx/id/aaa”才【能】使⽤@Path来拼接url
47    *    形如“?a=xxxx&b=xxxx&c=xxxx”的url是【不能】⽤@Path注解来拼接的,应该使⽤@Query或者@QueryMap注解
48    *    @GET("?app=weather.future&weaid=1&&appkey={key}")
49    * @param index
50    * @param id
51    * @return
52    */
53    @GET("page/{index}/id/{id}")
54    Observable<JsonObject> requestWeather(@Path("key") int index, @Path("id") int id);
55
56    //@Query和@QueryMap注解会把参数拼接到url后⾯,适⽤于GET请求
57
58    //键值对形式
59    @GET("?")
60    Observable<JsonObject> requestWeather(@Query("app") String app,@Query("appkey") int appkey); 61
62    //Map形式
63    @GET("?")
64    Observable<JsonObject> requestWeather(@QueryMap Map<String,String> params);
65
66    //List列表形式
67    @GET("?")
68    Observable<JsonObject> requestWeather(@QueryMap List<String> stringList);
69
70    //url形式
71    @GET
72    Observable<JsonObject> requestWeather(@Url String url);
73
74    //⽆请求参数形式
75    @GET("?")
76    Observable<JsonObject> requestWeather();
77
78    //==============================以上为GET请求⽅式===========================//
79
80
81    //==============================以下为POST请求⽅式===========================//
82    /**
83    * @Field或@FieldMap做表单提交,适⽤于POST请求;对应POST请求,需要结合@FormUrlEncoded来使⽤
84    * @Body会将请求参数放到请求体中,所以适⽤于POST请求
85    * @Body标签不能和@FormUrlEncoded或@Multipart标签同时使⽤,会报错
86    * @return
87    */
88    @FormUrlEncoded
89    @POST("/")
90    Observable<JsonObject> requestWeathers(@Field("app") String app,@Field("appkey") int appkey);
91
92    @FormUrlEncoded
93    @POST("/")
94    Observable<JsonObject> requestWeathers(@FieldMap Map<String,String> params);
95
96    /**
97    * @Body实际上是将类转换成json实体作为请求体来请求⽹络的
98    * 使⽤这个标签的意思是我们可以定义个实体类来封装参数,作为请求参数
99    * @Body标签不能和@FormUrlEncoded或@Multipart标签同时使⽤,会报错
100    * @param params
101    * @return
102    */
103    @POST("/")
104    Observable<JsonObject> requestWeathers(@Body RequestParams params);
105    class RequestParams{
106        String app;
107        int appkey;
108    }
109
110    //==============================以下为HTTP请求⽅式===========================//
111    /**
112    * @HTTP请求,可配置成以上⼏种中的任意⼀种,下⾯就分别以⼀种形式来举例
113    */
114    //@HTTP配置get请求
115    @HTTP(method = "GET", path = "?app=weather.future&&appkey=10003", hasBody = false)
116    Observable<JsonObject> requestWeather1(@Query("app") String app,@Query("appkey") int appkey);
117
118    //@HTTP配置post请求
119    //1.配置POST请求必须结合@FormUrlEncoded使⽤,否者会报错
120    //2.hasBody必须配置为true,否则报错
121    @FormUrlEncoded
122    @HTTP(method = "POST", path = "?", hasBody = true)
123    Observable<JsonObject> requestWeather2(@Field("app") String app,@Field("appkey") int appkey);
124
125    //==============================@Multipart 主要是与@POST结合使⽤做⽂件的上传===========================// 126    @Multipart
127    @POST("/")
128    Observable<ResponseBody> uploadFile(@Part("description") RequestBody description, @Par
t MultipartBody.Part file);
129
130    @Multipart
131    @POST("/")
132    Observable<ResponseBody> uploadFile(@PartMap Map<String, RequestBody> params);
133
134    //==============================@Streaming 主要做⼤⽂件下载===========================//
135    @GET
136    @Streaming
137    Observable<ResponseBody> downloadImage(@Url String url);
138
139
140    //==============================以下为使⽤ Call 上传图⽚的⼏种写法===========================//
141    /**
142    * 上传图⽂
143    * @param description
144    * @param file
145    * @return
146    */
147    @Multipart
148    @POST("web/shrink")
149    Call<ResponseBody> uploadFile1(@Part("description") RequestBody description, @Part MultipartBody.Part file);
150
151    /**
152    * 上传⼀张图⽚
153    * @param file
154    * @return
155    */
156    @Multipart
157    @POST("web/shrink")
158    Call<ResponseBody> uploadFile2(@Part() RequestBody file);
159
160    /**
161    * 上传⼀张图⽚另⼀种写法
162    * @param file
163    * @return
164    */
165    @Multipart
166    @POST()
167    Call<ResponseBody> uploadFile3(@Url String url, @Part() RequestBody file);
168
169    /**
170    * 上传数量确定的多张图⽚
171    * @param description
172    * @param img1
173    * @param img2
174    * @param img3
175    * @return
176    */
177    @POST("web/shrink")

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。