Retrofit
Retrofit
是一个类型安全的 HTTP
客户端,主要用于与 RESTful API
进行交互,简化了网络请求的流程。
Retrofit
适用 Converter 来处理请求和响应的转换,支持 JSON
、XML
、Protobuf
等格式。常见的转换器有:
GsonConvertFactory
: 用于JSON
格式的解析。MoshiConvertFactory
: 用于Moshi
的JSON
解析。SimpleXMLConvertFactory
: 用于XML
格式的解析。
Retrofit
支持同步(execute()
)和异步(enqueue()
)请求。Retrofit 和 OkHttp 一起适用,能使用拦截器(Interceptor
)来处理请求和响应
2. Retrofit 工作流程
- 定义接口: 使用
Retrofit
定义 HTTP 请求,利用注解来描述 API 的请求路径、HTTP 方法、请求体等。 - 创建 Retrofit 实例: 配置
Retrofit
实例,指定Base URL
和转换器
(例如,使用 Gson 解析 JSON)。 - 执行请求: 通过调用接口方法来执行请求,Retrofit 会根据接口定义自动生成网络请求,并返回相应的结果。
3. 主要功能和接口
GET
请求:用于获取数据。POST
请求:用于提交数据。PUT
请求:用于更新数据。DELETE
请求:用于删除数据。
4. 示例
- 添加
Retrofit
依赖
xml
dependencies {
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.squareup.okhttp3:okhttp:4.9.0'
}
- 定义 API 接口
java
public interface ApiService {
// 定义一个 GET 请求,获取用户信息
@GET("users/{user}/repos")
Call<List<Repo>> getUserRepos(@Path("user") String user);
// 定义一个 POST 请求,提交 JSON 数据
@POST("users")
Call<User> createUser(@Body User user);
// 定义一个异步请求的 GET 方法
@GET("users/{user}/repos")
Call<List<Repo>> getUserReposAsync(@Path("user") String user);
}
- 创建 Retrofit 实例
java
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com/")
.addConverterFactory(GsonConverterFactory.create()) // 使用 Gson 转换器
.build();
- 创建 API 服务
java
ApiService apiService = retrofit.create(ApiService.class);
- 发起同步请求
java
Call<List<Repo>> call = apiService.getUserRepos("octocat");
try {
Response<List<Repo>> response = call.execute(); // 同步执行
if (response.isSuccessful()) {
List<Repo> repos = response.body();
// 处理 repos 数据
} else {
// 处理请求失败的情况
}
} catch (IOException e) {
e.printStackTrace();
}
- 发起异步请求
java
Call<List<Repo>> call = apiService.getUserReposAsync("octocat");
call.enqueue(new Callback<List<Repo>>() {
@Override
public void onResponse(Call<List<Repo>> call, Response<List<Repo>> response) {
if (response.isSuccessful()) {
List<Repo> repos = response.body();
// 处理 repos 数据
}
}
@Override
public void onFailure(Call<List<Repo>> call, Throwable t) {
// 处理请求失败
}
});
5. 进阶功能
- 请求和响应拦截器:
可以使用 OkHttp
拦截器来对请求或响应进行处理。例如,添加统一的请求头,处理错误响应等。
java
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request().newBuilder()
.addHeader("Authorization", "Bearer token")
.build();
return chain.proceed(request);
}
})
.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com/")
.client(client) // 使用自定义的 OkHttpClient
.addConverterFactory(GsonConverterFactory.create())
.build();
- 自定义转换器:
除了 Gson
和 Moshi
等常见的转换器,你也可以自定义转换器来支持其他数据格式。
- 支持分页:
对于分页请求,可以通过 @Query
注解来传递分页参数,获取不同页面的数据。
- 缓存: 可以使用 OkHttp 的缓存机制,配置请求的缓存策略,减少不必要的网络请求。