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

一隻懂音樂的碼蟲發表於2018-04-26

《一》四種請求方式:

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();
複製程式碼


1、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);
複製程式碼


1、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網路請求引數註解](https://blog.csdn.net/jdsjlzx/article/details/52015347) [Retrofit常用註解解釋](https://blog.csdn.net/jdsjlzx/article/details/52015347)

相關文章