阅读 16

Retrofit 2.0 的使用

Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装(基于OkHttp)。

Retrofit 使用介绍

使用 Retrofit 可以分为7个步骤:

    1. 添加 Retrofit 库的依赖
    1. 创建接收服务器返回数据的类
    1. 创建用于描述网络请求的接口
    1. 创建 Retrofit 实例
    1. 创建网络请求接口实例
    1. 发送网络请求(同步/异步)
    1. 处理返回的数据

添加 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(),参数是一个回调

总结

    1. Retrofit 是基于 OkHttp 网络库的高级封装。
    1. 采用注解、网络请求参数配置更灵活、扩展性更好。
    1. 采用 RESTful 风格的 API 。

注意:

baseUrl 中的url地址要以 / 结尾。






About Me

关注下面的标签,发现更多相似文章
评论