Retrofit是由著名的 Square 公司開源的一個基于OkHttp實現(xiàn)網(wǎng)絡請求的框架鳖悠,以其簡易的接口配置宵统、強大的擴展支持蜒犯、優(yōu)雅的代碼結構受到大家的追捧絮供。
與OkHttp的關系
Retrofit2.0中網(wǎng)絡請求部分有OkHttp實現(xiàn),其框架層主要實現(xiàn)了接口層的封裝帆赢,對RESTful風格擁有完美的支持小压。
其中Retrofit層實現(xiàn)RESTful接口的封裝,OkHttp全權負責與服務器的交互椰于。Retrofit與OkHttp完全耦合怠益。
使用
首先引入Retrofit包和OkHttp包
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
implementation 'com.squareup.okhttp3:okhttp:3.8.0'
按照Retrofit官網(wǎng)的例子,定義訪問Github的接口
public interface GitHubService {
@GET("users/{user}/repos")
Call<List<Repo>> listRepos(@Path("user") String user);
}
Retrofit對域名及參數(shù)進行了封裝瘾婿,相當于訪問
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<List<Repo>> repos = service.listRepos("octocat");
執(zhí)行網(wǎng)絡請求
// 同步調用
List<Repo> data = repos.execute();
// 異步調用
repos.enqueue(new Callback<List<Repo>>() {
@Override
public void onResponse(Call<List<Repo>> call, Response<List<Repo>> response) {
List<Repo> data = response.body();
}
@Override
public void onFailure(Call<List<Repo>> call, Throwable t) {
t.printStackTrace();
}
});
RESTful接口封裝
Retrofit對RESTful風格接口具有完美的封裝,在Retrofit中憋他,各種網(wǎng)絡請求方式及參數(shù)都使用了注解孩饼,大大簡化的調用難度。
網(wǎng)絡請求方式主要有以下幾種:
- @GET
- @POST
- @PUT
- @DELETE
- @PATCH
- @HEAD
GET請求
@GET("users/{user}/repos")
Call<List<Repo>> listRepos(
@Path("user") String user
@Query("password") String password
);
其中@Path可以靈活傳入path路徑參數(shù)竹挡,@Query傳入需要傳入的請求參數(shù)值镀娶,當請求參數(shù)較多或有些參數(shù)不用傳時,可以使用@QueryMap靈活實現(xiàn)揪罕。
POST請求
@FormUrlEncoded
@POST("/")
Call<ResponseBody> example(
@Field("name") String name,
@Field("occupation") String occupation
);
POST請求中當需要使用表單形式傳參時梯码,可使用@FormUrlEncoded進行標記。傳入的參數(shù)使用@Field進行標記好啰,當傳入?yún)?shù)較多或有些參數(shù)不用傳時轩娶,可以使用@FieldMap靈活實現(xiàn)。
PUT請求
@FormUrlEncoded
@PUT("sys/user/resetPassword")
Call<ResponseBody> resetPassword(
@Field("telephone") String telephone,
@Field("password") String pwd
);
當需要修改服務器上的某些信息時框往,我們可以使用PUT請求鳄抒,其使用方式類似于POST請求。