Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装(基于OkHttp)。
Retrofit 使用介绍
使用 Retrofit 可以分为7个步骤:
-
- 添加 Retrofit 库的依赖
-
- 创建接收服务器返回数据的类
-
- 创建用于描述网络请求的接口
-
- 创建 Retrofit 实例
-
- 创建网络请求接口实例
-
- 发送网络请求(同步/异步)
-
- 处理返回的数据
添加 Retrofit 库依赖
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
常用参数注解
-
@GET、@POST、@PUT、@DELETE、@HEAD:确定请求方式
-
@Path:请求URL的字符替代
-
@Query:要传递的参数
-
@QueryMap:包含多个@Query注解参数
-
@Body:添加实体类对象
-
@FormUrlEncoded:URL编码
GET 请求
@GET("users/list")
@GET("users/list?sort=desc")
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId);
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @Query("sort") String sort);
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);
如何使用 @POST 请求,还可以和 @FormUrlEncoded 注解一起使用,表示将发送表单编码数据。每个键值对都使用包含名称的 @Field 和提供值的对象进行注释。
示例如下:
@POST("users/new")
Call<User> createUser(@Body User user);
@FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);
当方法中存在 @Multipart 时,将使用多部分请求。使用 @Part 注释声明部件。
示例如下:
@Multipart
@PUT("user/photo")
Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);
您可以使用@Headers批注为方法设置静态标头。
@Headers("Cache-Control: max-age=640000")
@GET("widget/list")
Call<List<Widget>> widgetList();
@Headers({
"Accept: application/vnd.github.v3.full+json",
"User-Agent: Retrofit-Sample-App"
})
@GET("users/{username}")
Call<User> getUser(@Path("username") String username);
请注意,标头不会相互覆盖。所有具有相同名称的标头都将包含在请求中。
可以使用 @Header 注释动态更新请求标头。必须为 @Header 提供相应的参数。如果该值为null,则将省略标头。否则,将在值上调用toString,并使用结果。
@GET("user")
Call<User> getUser(@Header("Authorization") String authorization)
@GET("user")
Call<User> getUser(@HeaderMap Map<String, String> headers)
Retrofit 2.0 来设置拦截器,只能通过OkHttp来实现,不管是在1.x还是2.0,这种方式都是比较推荐的。
OkHttpClient.Builder okBuilder = new OkHttpClient().newBuilder();
okBuilder.addNetworkInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request original = chain.request();
Request.Builder requestBuilder = original.newBuilder().addHeader("Accept", "application/json");
Request request = requestBuilder.build();
return chain.proceed(request);
}
});
okHttpClient = okBuilder.build();
发送请求
-
同步:调用 Call 对象的 execute(),返回结果的响应体
-
异步:调用 Call 对象的 enqueue(),参数是一个回调
总结
-
- Retrofit 是基于 OkHttp 网络库的高级封装。
-
- 采用注解、网络请求参数配置更灵活、扩展性更好。
-
- 采用 RESTful 风格的 API 。
注意:
baseUrl 中的url地址要以 / 结尾。
About Me