Retrofit2 网络请求框架
一,简介:
Retrofit可以将服务端的数据接口 API 转换为在客户端的Java对象,即可进行方法调用,得到希望请求的数据。它采用注解的方式动态生成请求API。
1.首先,创建远程请求接口:
public interface UsersService{
@GET("users/{id}")
Call<ResponseBody> getUser(@Path("id") int id);
}
2.用Retrofit生成Java类并向服务器请求数据
public void getHttpData(){
//服务器地址
String url = "http://your.service.url.com/";
//以服务器地址创建Retrofit
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(url)
.build();
//以Retrofit生成API的Java对象
UsersService usersService = retrofit.create(UsersService.class);
//想服务器请求数据
Call<ResponseBody> call = usersService.getUser(3);
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
//成功返回数据response.body().toString()
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
//请求失败
}
});
}
二, 添加依赖库support支持:
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
//Gson转换器
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
//RxJava适配器
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
三,Converter与CallAdapter
Converter可以将ResponseBody转换为我们想要的类型。
CallAdapter可以将Call转换为RxJava的Observable。即可对返回数据进行RxJava操作。
添加工厂方法:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(url)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
三,Retrofit注解
你应该知道的HTTP基础知识
请求类:GET,POST,PUT,DELETE,HEAD,PATCH,OPTIONS,HTTP
标记类:FormUrlEncoded,MultiPart,Streaming
参数类:Headers,Header,Body,Field,FieldMap,Part,PartMap,Path,Query,QueryMap,Url
1.@GET 获取数据(查)
请求类型:GET,路径:users/{id} 表示users表下的id,{id}表示数字,@Path标记路径为id,返回ResponseBody。
public interface UsersService{
@GET("users/{id}")
Call<ResponseBody> getUser(@Path("id") int queryId);
}
2.@POST 提交数据(增),把参数放在请求体传送给后台。
返回Response或者Result两种写法都可以,@Body表示请求体,这里使用CallAdapter将Call转换为Observable,使用Converter转ResponseBody为Gson类
public interface UsersService {
@POST("users")
Observable<Response<User>> addUser(@Body User user);
}
public void getHttpData() {
//服务器地址
String url = "http://your.service.url.com/";
//以服务器地址创建Retrofit
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(url)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
//以Retrofit生成API的Java对象
UsersService usersService = retrofit.create(UsersService.class);
Observable<Response<User>> response = usersService.addUser(new User());
response.subscribe(new Consumer<Response<User>>() {
@Override
public void accept(Response<User> userResponse) throws Exception {
//处理response
}
});
}
3.@PUT 更新数据(改)
这里使用CallAdapter将Call转换为Observable,使用Converter转ResponseBody为Gson类。
public interface UsersService{
@PUT("users/{id}")
Observable<Result<User>> updateUser(@Path("id") int id,@Body User user);
}
4.@DELETE 删除数据(删)
public interface UsersService{
@DELETE("users/{id}")
Observable<Response<User>> deleteUser(@Path("id") int id);
}
5.@PATCH
6.@OPTIONS
7.@HEAD
8.@HTTP 可以替换上面7中类型
9.@Path 用于制定Url中的路径,如“users/{id}”,可以指定id。
public interface UsersService{
@HTTP(method = "GET",path = "users/{id}",hasBody = false)
Observable<Response<User>> getUser(@Path("id") int id);
}
10.@FormUrlEncoded 表示请求体是一个表单(Content-Type:application/x-www-form-urlencoded),参数在请求方法中,发送form-encoded的数据,每个键值对需要用@Filed来注解键名,随后的对象需要提供值。
public interface addService {
@FormUrlEncoded
@POST("users")
Observable<Response<User>> addUser(@Field("name") String name, @Field("age") int age);
}
11.@Multipart 表示这是一个支持文件上传的表单,发送form-encoded的数据,每个键值对需要用@Part来注解键名,随后的对象需要提供值。
12.@Streaming 表示数据以流的形式返回。
13.@Headers 在头部添加请求头参数。
14.@Header 在参数中添加请求头参数。
public interface UsersService {
@Headers({"key:value","key2:value2"})
@POST("users")
Observable<Response<User>> addUsers(@Header("key3") String value3);
}
15.@Body 以POST传递自定义对象,采用Gson传递对象User。
public interface addService {
@POST("users")
Observable<Response<User>> addUser(@Body User user);
}
16.@Field 以POST提交,指定请求体字段的key-alue。
17.@FieldMap 以POST提交,以Map封装多对数据到请求体。配合 @FormUrlEncoded 使用
public interface UsersService {
@FormUrlEncoded
@POST("users")
Observable<Response<User>> addUser(@FieldMap Map<String, Object> map);
}
public void getHttpData() {
Map<String, Object> mMap = new HashMap<>();
mMap.put("name", "song");
mMap.put("age", 25);
mMap.put("address", "adfsdfsdf");
//服务器地址
String url = "http://your.service.url.com/";
//以服务器地址创建Retrofit
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(url)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
//以Retrofit生成API的Java对象
UsersService usersService = retrofit.create(UsersService.class);
Observable<Response<User>> response = usersService.addUser(mMap);
response.subscribe(new Consumer<Response<User>>() {
@Override
public void accept(Response<User> userResponse) throws Exception {
//处理response
}
});
}
18.@Part 以POST提交数据,与 @Multipart 注解配合使用。Part后面支持三种类型,RequestBody、 okhttp3.MultipartBody.Part 、任意类型。
除 okhttp3.MultipartBody.Part以外,其它类型都必须带上表单字段,因为okhttp3.MultipartBody.Part中已经包含了表单字段的信息)。
19.@PartMap 以POST提交数据,与 @Multipart 注解配合使用。支持 RequestBody 类型,如果有其它的类型,会被Converter转换成 RequestBody,如GsonRequestBodyConverter。
public interface UsersService {
@POST("/form")
@Multipart
Observable<Result<User>> upLoad1(@Part("name") RequestBody name, @Part("age") RequestBody age, @Part MultipartBody.Part file);
@POST("/form")
@Multipart
Observable<Response<User>> upLoad2(@PartMap Map<String, RequestBody> args, @Part MultipartBody.Part file);
}
20.@Query 用于指定Url之后的参数,用法类似@Field。
21.@QueryMap 用于指定Url后面的多个参数,用法类似@FieldMap。
22.@Url 当请求头没有指定Url时,需要在参数中指定Url
public interface UsersService {
@GET
Observable<Response<User>> getUser(@Url String url, @Query("id") int id, @QueryMap Map<String,Object> map);
}