輕鬆搞定Retrofit不同網路請求方式的請求引數配置,Retrofit常用註解的使用

weixin_34007291發表於2018-04-25

《一》四種網路請求方式:

  • GET : 向伺服器發起資料請求,獲取資訊。類似於資料庫的select操作,只是查詢,不會影響資源的內容。
  • POST : 向伺服器傳送資料,該請求會改變資料的種類等資源。類似於資料庫的insert操作,會建立新的內容。
  • DELETE:用來刪除某一個資源。類似於資料庫的delete操作。
  • PUT : 向伺服器傳送資料,從而改變資訊。類似於資料庫的update操作,用來修改內容。

《二》Retrofit通過註解的方式,配置不同的網路請求。主要涉及到@Path、@Query、@QueryMap、@Body、@Field的用法等。

假設你的BASE_URL = "http://192.168.0.1/"

1、GET請求:

(1)情形一:

@Query

僅帶查詢引數:http://192.168.0.1/weather?city=北京

   @GET("weather")
   Observable<WeatherEntity> getWeather(@Query("city") String city);

(2)情形二:

@Path

請求引數直接跟在請求路徑下:http://192.168.0.1/weather/北京

    @GET("weather/{city_name}")
    Observable<Object> getWeather(@Path("city_name") String city_name);

(3)情形三:

@Path和@QueryMap結合

此種情形用得比較少:http://192.168.0.1/weather/北京?user_id=1&user_name=jojo

    @GET("weather/{city_name}")
    Observable<Object> getWeather(@Path("city_name")String city_name, @QueryMap Map<String, String> queryParams);
    HashMap<String, String> queryParams= new HashMap<>();
    hashMap.put("user_id","1");
    hashMap.put("user_name","jojo");

2、POST請求:

(1)情形一: http://192.168.0.1/comment
body引數:{"comment_id":"1","content":"我是評論","user_id":"1001"}

@Filed 方式處理
    @FormUrlEncoded //使用@Field時記得新增@FormUrlEncoded
    @POST("comment")
    void doComments(@Field("comment_id")String comment_id, @Field("content")String content, @Field("user_id") String user_id);
@FieldMap 方式處理
    @FormUrlEncoded
    @POST("comment")
    void doComments(@FieldMap Map<String, String> paramsMap );

通過鍵值對,以表單的形式提交:

        HashMap<String, String> hashMap = new HashMap<>();
        hashMap.put("comment_id","1");
        hashMap.put("content","我是評論");
        hashMap.put("user_id","1001");
@Body方式處理
    @POST("comment")
    void doComments(@Body Object reqBean);
   @POST("comment")
    void doComments(@Body List<Object> requestList);

(2)情形二:Retrofit檔案上傳: http://192.168.0.1/upload/

  /**
     * 檔案上傳
     */
    @POST("upload/")
    Observable<Object> uploadFile(@Body RequestBody requestBody);

只不過檔案上傳傳入的是RequestBody型別,下面是構建RequestBody的方式:

        File file = new File(mFilePath); //mImagePath為上傳的檔案絕對路徑
        //構建body
        RequestBody requestBody = new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
                .addFormDataPart("file", file.getName(), RequestBody.create(MediaType.parse("multipart/form-data"), file))
                .build();

3、PUT請求:

(1)情形一:http://192.168.0.1/comment/88

    @PUT("comment/{comment_id}")
    void comment(@Path("comment_id") String comment_id);

(2)情形二:http://192.168.0.1/comment/88?user_id=1001

    @PUT("comment/{comment_id}")
    void comment(@Path("comment_id") String comment_id @Query("user_id") String user_id);

(3)情形三:http://192.168.0.1/comment/88?user_id=1001
加body引數:{"content":"我是評論","type":"1"}

此類請求的應用場景:適合於body中需要傳入多個請求引數,這樣可以將多個請求的引數欄位封裝到一個實體中,這樣就不用寫多個@Filed了。

public class RequestBean {
    public String content;
    public String type;
    //實際中可能還有多個請求欄位
}
    RequestBean  requestBean = new RequestBean();
    requestBean .content = "我是評論";
    requestBean .type = "1";
    @PUT("comment/{comment_id}")
    void comment(@Path("comment_id") String comment_id @Query("user_id") String user_id @Body RequestBean reqBean);

4、DELETE請求:

假如刪除評論:http://192.168.0.1/comment/88

    @DELETE("comment/{comment_id}")
    void comment(@Path("comment_id") String comment_id);

其他可能的delete請求,配置方式都是類似的,這裡就不多舉例了。主要是要好好理解下面這些常用的請求引數註解的作用和用法。

綜上所述,可以歸納出上面幾個註解的用法:

@Path : 請求的引數值直接跟在URL後面時,用@Path配置
@Query: 表示查詢引數,以?key1=value1&key2=value2的形式跟在請求域名後面時使用@Query
@QueryMap :以map的方式直接傳入多個鍵值對的查詢引數
@Field: 多用於post請求中表單欄位,每個@Field後面,對應一對鍵值對。
@FieldMap :以map的方式傳入多個鍵值對,作為body引數
@Body: 相當於多個@Field,以物件的形式提交

注意:Filed和FieldMap需要FormUrlEncoded結合使用,否則會拋異常!

更多配置URL請求路徑的註解的瞭解可以參考:
Retrofit網路請求引數註解
Retrofit常用註解解釋

最後,附上我的一個Kotlin編寫+元件化開發的開源專案Designer

Kotlin+元件化開發實踐—開源專案Designer-App

Designer專案算是傾注了我蠻多心血了,每個頁面和功能都當成是上線的App來做,App的logo還特地做了UI設計?力求做到精緻和完善,其中還包括了很多自己專案開發中的經驗彙總和對新技術的探索和整合,希望對各位讀者有所幫助,歡迎點個star,follow,或者給個小心心,嘻嘻?也可以分享給你更多的朋友一起學習,您的支援是我不斷前進的動力。如果有任何問題,歡迎在GitHub上給我提issue或者留言。

相關文章