Retrofit是由著名的 Square 公司开源的一个基于OkHttp实现网络请求的框架,以其简易的接口配置、强大的扩展支持、优雅的代码结构受到大家的追捧。
与OkHttp的关系
Retrofit2.0中网络请求部分有OkHttp实现,其框架层主要实现了接口层的封装,对RESTful风格拥有完美的支持。
其中Retrofit层实现RESTful接口的封装,OkHttp全权负责与服务器的交互。Retrofit与OkHttp完全耦合。
使用
首先引入Retrofit包和OkHttp包
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
implementation 'com.squareup.okhttp3:okhttp:3.8.0'
按照Retrofit官网的例子,定义访问Github的接口
public interface GitHubService {
@GET("users/{user}/repos")
Call> listRepos(@Path("user") String user);
}
Retrofit对域名及参数进行了封装,相当于访问
https://api.github.com/users/{user}/repos
listRepos方法中可以传入相应的用户名
接下来,构造 Retrofit
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com/")
.build();
GitHubService service = retrofit.create(GitHubService.class);
调用listRepos方法
Call> repos = service.listRepos("octocat");
执行网络请求
// 同步调用
List data = repos.execute();
// 异步调用
repos.enqueue(new Callback>() {
@Override
public void onResponse(Call> call, Response> response) {
List data = response.body();
}
@Override
public void onFailure(Call> call, Throwable t) {
t.printStackTrace();
}
});
RESTful接口封装
Retrofit对RESTful风格接口具有完美的封装,在Retrofit中,各种网络请求方式及参数都使用了注解,大大简化的调用难度。
网络请求方式主要有以下几种:
- @GET
- @POST
- @PUT
- @DELETE
- @PATCH
- @HEAD
GET请求
@GET("users/{user}/repos")
Call> listRepos(
@Path("user") String user
@Query("password") String password
);
其中@Path可以灵活传入path路径参数,@Query传入需要传入的请求参数值,当请求参数较多或有些参数不用传时,可以使用@QueryMap灵活实现。
POST请求
@FormUrlEncoded
@POST("/")
Call example(
@Field("name") String name,
@Field("occupation") String occupation
);
POST请求中当需要使用表单形式传参时,可使用@FormUrlEncoded进行标记。传入的参数使用@Field进行标记,当传入参数较多或有些参数不用传时,可以使用@FieldMap灵活实现。
PUT请求
@FormUrlEncoded
@PUT("sys/user/resetPassword")
Call resetPassword(
@Field("telephone") String telephone,
@Field("password") String pwd
);
当需要修改服务器上的某些信息时,我们可以使用PUT请求,其使用方式类似于POST请求。