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小时内删除。
发表评论