Retrofit簡(jiǎn)單使用

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)建了baseurlConverterFactory,通過(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);}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容