Android開發中Retrofit常見註解全解析

程式IT猿發表於2017-10-30

導語

Android開發圈中這三者Retrofit+RxJava+MVP結合使用的頻率已經相當高了,很多圈內大神也已經總結了很多有關於整合這三者的部落格,已經很多了,今天寫這篇文章主要就不再介紹了。不過很多人並不瞭解Retrofit的全部註解使用,今天的重點就是要介紹日常常用的Retrofit的註解。

1、什麼是Retrofit?

Retrofit 是一個Square開發的安卓客戶端請求庫。其中內部封裝了okhttp庫。官方的介紹是使用非常簡短 Retrofit使用註解,能夠極大的簡化網路請求資料的程式碼。
Retrofit常用註解包括:@Query,@QueryMap,@Field,@FieldMap,@FormUrlEncoded,@Path,@Url

2、@Query,@QueryMap

@Query主要用於Get請求資料,用於拼接在拼接在Url路徑後面的查詢引數,一個@Query相當於拼接一個引數,多個引數中間用,隔開。
使用示例程式碼:

Retrofit retrofit = new Retrofit.Builder() 
.baseUrl("http://ms.csdn.net/")
 .build();public interface csdnService { //如果沒有引數 @GET("api/ask/all_questions") 
Call<List<Repo>> getData(); 
//只有少數引數 
@GET("api/ask/all_questions") 
Call<List<Repo>> getData(@Query("page") int page, @Query("is_reward") int is_reward);
 }複製程式碼

@QueryMap:主要的效果等同於多個@Query引數拼接,主要也用於Get請求網路資料。

@GET("http://ms.csdn.net/api/ask/all_questions")
Call<List<Repo>> getData(@QueryMap Map<String,String> params);
Map<String,String>params=newHashMap();
params.put("name","liming");
params.put("age",24);
params.put("sex","man");
params.put("city","Shanghai");複製程式碼

這樣等價於請求資料介面為
ms.csdn.net/api/ask/all…

3、@Field,@FieldMap

@Field的用法類似於@Query,就不在重複列舉了,主要不同的是@Field主要用於Post請求資料。
@FieldMap的用法類似於@QueryMap。
兩者主要區別是:如果請求為post實現,那麼最好傳遞引數時使用@Field、@FieldMap和@FormUrlEncoded。因為@Query和或QueryMap都是將引數拼接在url後面的,而@Field或@FieldMap傳遞的引數時放在請求體的。

4、@FormUrlEncoded

我們在程式碼中使用是不是發現了@POST比起@GET多了一個@FromUrlEncoded的註解。
如果去掉@FromUrlEncoded在post請求中使用@Field和@FieldMap,那麼程式會丟擲Java.lang.IllegalArgumentException: @Field parameters can only be used with form encoding. 的錯誤異常。
所以如果平時公司如果是Post請求的話,千萬別忘記了加這@FromUrlEncoded註解。

@FormUrlEncoded
@POST("users/user/question")
Call<TnGou> getTngouPost(@Field("page") int page);複製程式碼

5、@Path

@Path主要用於Get請求,用於替換Url路徑中的變數字元。

public interface csdnService {
@GET("users/{user}/question") 
Call<List<Repo>> getData(@Path("user") String user);}複製程式碼

該介面定義了一個getData方法,該方法通過GET請求去訪問伺服器的users/{user}/question路徑,其中通過@Path註解會把路徑中的{user}替換成引數user的具體值。比如:user的值如果是zhangsan,那麼Url的路徑就是users/zhangsan/question.

6、@Url

@Url是動態的Url請求資料的註解。需要注意的是使用@Path時,path對應的路徑不能包含”/”,不然每個加到host Url後面的東西都會被省略掉。千萬注意了

Retrofit retrofit = new Retrofit.Builder() 
.baseUrl("http://ms.csdn.net/") 
.build(); 
public interface csdnService {
@GET 
Call<List<Repo>> getData(@Url String user);
 }複製程式碼

7、總結

歡迎大家關注我的公眾號:程式IT圈。特別宣告:未經允許,禁止任何形式的轉載!

相關文章