网络编程总结(十):Retrofit 官方文档

Retrofit 是什么?

Retrofit 是一个适用于 Android 和 Java 的安全类型的 HTTP 客户端。

Retrofit 和 OkHttp 都是出自 Square 公司,Retrofit 对 OkHttp 做了封装,把网络请求交给 OkHttp,我们只需要通过简单的配置就可以使用 Retrofit 来进行网络请求了。

其作者是大神 Jake Wharton

Retrofit 官网:http://square.github.io/retrofit/

Retrofit Github:https://github.com/square/retrofit

下载 Retrofit

到下面的链接下载最新版本的 JAR 包:

https://search.maven.org/remote_content?g=com.squareup.retrofit2&a=retrofit&v=LATEST

目前最新的版本是 V2.2.0

或者通过 Maven :

<dependency>
  <groupId>com.squareup.retrofit2</groupId>
  <artifactId>retrofit</artifactId>
  <version>2.2.0</version>
</dependency>

或者通过 Gradle 构建:

compile 'com.squareup.retrofit2:retrofit:2.2.0'

开发版的快照可以在这里找到:

https://oss.sonatype.org/content/repositories/snapshots/

Retrofit 要求的最低版本: Java 7 或者 Android 2.3

简介(Introduction)

Retrofit 将你的 HTTP API 转为 Java 接口。

public interface GitHubService {
  @GET("users/{user}/repos")
  Call<List<Repo>> listRepos(@Path("user") String user);
}

Retrofit 类生成 GitHubService 接口的实现:

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.github.com/")
    .build();

GitHubService service = retrofit.create(GitHubService.class);

来自创建的 GitHubService 的每个 Call 可以向远程 WEB 服务器发出同步或异步 HTTP 请求。

Call<List<Repo>> repos = service.listRepos("octocat");

使用注释来描述 HTTP 请求:

  • URL 参数替换和查询参数支持。

  • 对象转换为请求体(例如 JSON,协议缓冲区)

  • 多部分请求体和文件上传

API 声明(API Declaration)

接口方法及其参数的注释表示如何处理请求。

请求方法(REQUEST METHOD)

每个方法都必须有一个请求方法和一个相对的 URL 的 HTTP 注释,有五个内置注释:GETPOSTPUTDELETEHEAD,资源的相对 URL 在注释中指定。

@GET("users/list")

也可以在 URL 中执行查询参数

@GET("users/list?sort=desc")

URL 操作(URL MANIPULATION)

可以 URL 可以使用替换块和参数的方法动态更新。替换块是由{} 包围的字母、数字和字符串。函数参数必须使用 @Path 来注释说明,并且注释的参数为同样的字符串。

@GET("group/{id}/users")// 动态参数是 id
Call<List<User>> groupList(@Path("id") int groupId);// Path 注解的参数和之前的参数字符串一样

也可以添加查询参数:

@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @Query("sort") String sort);

对于复杂的查询组合,可以使用 Map:

@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);

请求体(REQUEST BODY)

可以@Body注释一个对象作为 HTTP 请求体。

@POST("users/new")
Call<User> createUser(@Body User user);

该对象也可以使用 Retrofit 实例上指定的转换器进行转换器。如果没有加入转换器,则只能使用 RequestBody。

表单编码和 MULTIPART

可以声明方法发送 form-encodedmultipart data

当方法中有 @FormUrlEncoded 时,会发送表单编码数据。每个键值对都使用 @Field 进行注释,指定每个表单项的 Key-Value 值。

@FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);

当方法中有 @Multipart 时,会使用 Multipart 请求。每个部件使用 @Part 注释。

@Multipart
@PUT("user/photo")
Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);

Multipart 中的 part 使用 Retrofit 的转换器来进行转换,也可以实现 RequestBody 来自己序列化。

处理请求头(HEADER MANIPULATION)

你可以使用 @Headers 来注释静态头信息。

@Headers("Cache-Control: max-age=640000")
@GET("widget/list")
Call<List<Widget>> widgetList();

```java
@Headers({
"Accept: application/vnd.github.v3.full+json",
"User-Agent: Retrofit-Sample-App"
})
@GET("users/{username}")
Call getUser(@Path("username") String username);

注意,头信息不会被覆盖,所有名称相同的头信息都将包含在请求中。

可以使用 `@Header` 注释动态更新请求头。必须想 `@Header` 提供相对应的参数。如果值为 null,则头将被忽略。否则,将会回调这个值的 toString 方法,使用其返回结果。
```java
@GET("user")
Call<User> getUser(@Header("Authorization") String authorization)

可以使用 OkHttp 拦截器指定需要添加到每个请求头中的标题。

同步 VS 异步(SYNCHRONOUT VS. ASYNCHRONOUS)

Call 对象可以同步或异步执行。每个对象只能使用一次,但是调用 clone() 将创建一个可以使用的新的对象。

在 Android 上,回调将在主线程上执行。在 JVM 上,回调将和执行 HTTP 请求在同一个线程上。

Retrofit 配置(Retrofit Configuration)

Retrofit 是将 API 接口转换为可调用的对象的类。默认情况下,Retrofit 将为您的平台提供一致的默认值,但是允许用户自定义。

转换器(CONVERTERS)

默认情况下,Retrofit 只能反序列化 OkHttp 的 ResponseBody 类型,它只能接收 @Body 的 RequestBody 类型。

可以添加转换器来支持其他类型。下面是六个常用的的序列化库,方便你使用

  • Gson:com.squareup.retrofit2:converter-gson

  • Jackson:Jackson: com.squareup.retrofit2:converter-jackson

  • Moshi:com.squareup.retrofit2:converter-moshi

  • Protobuf:com.squareup.retrofit2:converter-protobuf

  • Wire:com.squareup.retrofit2:converter-wire

  • Simple XML:com.squareup.retrofit2:converter-simplexml

  • Scalars (primitives, boxed, and String):com.squareup.retrofit2:converter-scalars

下面是使用 GsonConverterFactory 类使用 Gson 进行反序列化 GitHubService 接口的例子:

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.github.com")
    .addConverterFactory(GsonConverterFactory.create())
    .build();

GitHubService service = retrofit.create(GitHubService.class);

自定义转换器(CUSTOM CONVERTERS)

如果你需要使用 Retrofit 不支持的内容格式,或者希望使用不同的库与现有格式的 API 进行通信,你可以创建你自己的转换器,创建 Converter.Factory 类的子类,并在构建起中传递一个实例。

Copyright© 2020-2022 li-xyz 冀ICP备2022001112号-1