官网:https://square.github.io/retrofit/
入门教程(入门、源码、设计模式):https://www.jianshu.com/p/8e6d16a982b8
Retrofit 简介
A type-safe HTTP client for Android and Java。 Retrofit requires at minimum Java 8+ or Android API 21+
Retrofit是采用 RESTfull 的HTTP网络请求框架,内部是基于OkHttpClient的源码进行封装。进一步简化网络请求
快速集成
<properties>
<retrofit.version>2.9.0</retrofit.version>
</properties>
<dependencies>
<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>retrofit</artifactId>
<version>${retrofit_version}</version>
</dependency>
<!-- 添加对应转换器 -->
<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>converter-jackson</artifactId>
<version>${retrofit.version}</version>
</dependency>
</dependencies>
// 定义接口
public interface GarbageService {
@GET("api/garbage/types")
Call<RespBase<List<GarbageTypeDTO>>> listGarbageTypes();
@POST("api/garbage/items/page")
Call<RespBase<RespPage<GarbageItemDTO>>> pageQueryGarbageItems(@Body ReqPage reqPage);
}
// 使用Retrofit调用
@SneakyThrows(IOException.class)
public void simpleRetrofit() {
Retrofit retrofit = new Retrofit.Builder()
// 支持传入OkHttpClient
// .client()
.baseUrl("")
// 支持传入 ObjectMapper / Gson
.addConverterFactory()
.build();
GarbageService service = retrofit.create(GarbageService.class);
Call<RespBase<List<GarbageTypeDTO>>> respBaseCall = service.listGarbageTypes();
Response<RespBase<List<GarbageTypeDTO>>> response = respBaseCall.execute();
if (response.isSuccessful()) {
// ...
}
ReqPage reqPage = new ReqPage();
reqPage.setPage(1);
reqPage.setSize(10);
Call<RespBase<RespPage<GarbageItemDTO>>> respBaseCall1 = service.pageQueryGarbageItems(reqPage);
respBaseCall1.enqueue(new Callback<RespBase<RespPage<GarbageItemDTO>>>() {
@Override
public void onResponse(Call<RespBase<RespPage<GarbageItemDTO>>> call, Response<RespBase<RespPage<GarbageItemDTO>>> response) {
if (response.isSuccessful()) {
// ...
}
}
@Override
public void onFailure(Call<RespBase<RespPage<GarbageItemDTO>>> call, Throwable throwable) {
}
});
}
Retrofit 使用详解
如何使用注解定义访问的接口
// Query Path variables
@GET("users/{user}/repos")
Call<List<Repo>> listRepos(@Path("user") String user);
@GET("users/list?sort=desc")
// Query parameter
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);
// RequestBody
@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
@Multipart
@PUT("user/photo")
Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);
// 请求头
@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);
@GET("user")
Call<User> getUser(@Header("Authorization") String authorization)
@GET("user")
Call<User> getUser(@HeaderMap Map<String, String> headers)
声明的Header不会互相覆盖。所有的Header有这一样的名字都会被添加到请求里
Retrofit是将你的API请求转换成Call对象,Call 支持同步和异步执行,每一个Call实例只能被使用一次。
Retrofit 配置
Converter
Converter的作用就是在数据返回的时候,对数据进行对应格式的转换,减化了解析数据的过程。Converters是在一开始创建Retrofit对象时进行配置的。
自带的Converter
- Gson:
com.squareup.retrofit2:converter-gson
- 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
- JAXB:
com.squareup.retrofit2:converter-jaxb
- Scalars (primitives, boxed, and String):
com.squareup.retrofit2:converter-scalars
在创建 Retrofit
实例时传入对应的 ConverterFactory
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com/")
.addConverterFactory(GsonConverterFactory.create())
.build();
GitHubService service = retrofit.create(GitHubService.class);
自定义 Converter
TODO
Retrofit 源码解析
推荐阅读,这里只引用作者的两张图以作备忘。
https://www.jianshu.com/p/2d34a51d6be2
完成一次请求过程
源码解读流程图