Retrofit是什么
對(duì)于Retrofit ,官方的描述是:“A type-safe REST client for Android and Java.”它可以通過(guò)注解來(lái)描述Http請(qǐng)求,URL參數(shù),查詢(xún)參數(shù),同時(shí),它還支持多個(gè)請(qǐng)求體和文件上傳
Retrofit 2默認(rèn)情況下利用okhttp為網(wǎng)絡(luò)層
Retrofit用法示例
官網(wǎng)示例
- 1 定義java接口
public interface GitHubService {
@GET("users/{user}/repos")
Call<List<Repo>> listRepos(@Path("user") String user);
}
該接口定義了一個(gè) listRepos方法,該方法會(huì)通過(guò)HTTP GET請(qǐng)求去訪問(wèn)服務(wù)器的/users/{user}/repos路徑并把返回的結(jié)果封裝為List<Repo>Java對(duì)象返回。其中URL路徑中的{user}的值為listRepos方法中的參數(shù) user的取值。
- 2 通過(guò) RestAdapter類(lèi)來(lái)生成一個(gè) GitHubService 接口的實(shí)現(xiàn);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com/")
.build();
GitHubService service = retrofit.create(GitHubService.class);
- 3 獲取接口的實(shí)現(xiàn)后就可以調(diào)用接口函數(shù)來(lái)和服務(wù)器交互
Call<List<Repo>> repos = service.listRepos("octocat");
從上面的示例可以看出, Retrofit 使用注解來(lái)聲明HTTP請(qǐng)求
- 支持 URL 參數(shù)替換和查詢(xún)參數(shù)
- 返回結(jié)果轉(zhuǎn)換為Java對(duì)象(返回結(jié)果可以為JSON, protocol buffers)
- 支持 Multipart請(qǐng)求和文件上傳
一般使用
首先定義接口
public interface ApiCallBiz {
@GET("data/Android/{number}/{page}")
Call<List<AndroidInfoBean>> getAndroidInfo(@Path("number") int number, @Path("page") int page);
}
getAndroidInfo( )方法通過(guò)注解@GET標(biāo)注為get請(qǐng)求,完整的url根據(jù)創(chuàng)建retrofit對(duì)象時(shí)傳入的baseUrl+@GET的所填寫(xiě)的value組成,value的完整值會(huì)根據(jù)調(diào)用接口是傳入的參數(shù)補(bǔ)充完整,例如data/Android/10/1
創(chuàng)建 retrofit對(duì)象完成請(qǐng)求服務(wù)器
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://gank.io/api/")
.addConverterFactory(GsonConverterFactory.create())//gson解析
.build();
ApiCallBiz mApiCallBiz =retrofit.create(ApiCallBiz.class);
Call<List<AndroidInfoBean>> call = mApiCallBiz.getAndroidInfo1(10,1);
call.enqueue(new Callback<List<AndroidInfoBean>>() {
@Override
public void onResponse(Call<List<AndroidInfoBean>> call,Response<List<AndroidInfoBean>> response) {
Log.e("TAG",response.body().toString());
}
@Override
public void onFailure(Call<List<AndroidInfoBean>> call, Throwable t) {
}
});
構(gòu)造者模式構(gòu)建了baseurl及ConverterFactory,通過(guò)GsonConverterFactory完成對(duì)服務(wù)器返回的json數(shù)據(jù)進(jìn)行對(duì)象的轉(zhuǎn)換
注意:.addConverterFactory(GsonConverterFactory.create())
這里如果使用gson,需要額外導(dǎo)入
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
上述示例展示了使用@Path可實(shí)現(xiàn)動(dòng)態(tài)url的訪問(wèn),retrofit還支持
- 查詢(xún)參數(shù)的設(shè)置
@Query
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @Query("sort") String sort);
對(duì)于復(fù)雜的查詢(xún)參數(shù)的組合可以使用一個(gè)Map。
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);
-
@POST請(qǐng)求體@Body
@POST("users/new")
Call<User> createUser(@Body User user);
- 表單的方式傳遞鍵值對(duì)
@FormUrlEncoded
@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);
- 多文件上傳
@PartMap
@Multipart @POST("register")
Call<User> registerUser(@PartMap Map<String, RequestBody> params, @Part("description") RequestBody description);}