Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装(基于OkHttp)。java
使用 Retrofit 能够分为7个步骤:git
添加 Retrofit 库依赖github
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
复制代码
@GET、@POST、@PUT、@DELETE、@HEAD:肯定请求方式json
@Path:请求URL的字符替代bash
@Query:要传递的参数服务器
@QueryMap:包含多个@Query注解参数网络
@Body:添加实体类对象app
@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(),参数是一个回调
注意:
baseUrl 中的url地址要以 /
结尾。
About Me