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
到下面的链接下载最新版本的 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
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,协议缓冲区)
多部分请求体和文件上传
接口方法及其参数的注释表示如何处理请求。
每个方法都必须有一个请求方法和一个相对的 URL 的 HTTP 注释,有五个内置注释:GET
、POST
、PUT
、DELETE
和 HEAD
,资源的相对 URL 在注释中指定。
@GET("users/list")
也可以在 URL 中执行查询参数
@GET("users/list?sort=desc")
可以 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);
可以@Body
注释一个对象作为 HTTP 请求体。
@POST("users/new")
Call<User> createUser(@Body User user);
该对象也可以使用 Retrofit 实例上指定的转换器进行转换器。如果没有加入转换器,则只能使用 RequestBody。
可以声明方法发送 form-encoded
和 multipart 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 来自己序列化。
你可以使用 @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
注意,头信息不会被覆盖,所有名称相同的头信息都将包含在请求中。
可以使用 `@Header` 注释动态更新请求头。必须想 `@Header` 提供相对应的参数。如果值为 null,则头将被忽略。否则,将会回调这个值的 toString 方法,使用其返回结果。
```java
@GET("user")
Call<User> getUser(@Header("Authorization") String authorization)
可以使用 OkHttp 拦截器指定需要添加到每个请求头中的标题。
Call 对象可以同步或异步执行。每个对象只能使用一次,但是调用 clone() 将创建一个可以使用的新的对象。
在 Android 上,回调将在主线程上执行。在 JVM 上,回调将和执行 HTTP 请求在同一个线程上。
Retrofit 是将 API 接口转换为可调用的对象的类。默认情况下,Retrofit 将为您的平台提供一致的默认值,但是允许用户自定义。
默认情况下,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);
如果你需要使用 Retrofit 不支持的内容格式,或者希望使用不同的库与现有格式的 API 进行通信,你可以创建你自己的转换器,创建 Converter.Factory 类的子类,并在构建起中传递一个实例。