《一》四種請求方式:
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,以物件的形式提交