Rxjava 常用的網路請求幾種方式的書寫
專案中使用 Rxjava 進行網路請求,請求的方式有 get 請求和 post 請求,而請求中 有時候 需要 請求頭 head,有時候需要 請求 json 串,琳琳種種,梳理下思路:
#1. get 請求
## 無引數-get
```
@GET("login/sys")
ObservablegetTKUrl();
```
## 有引數-get ,用 Query 查詢欄位
```
@GET("customer/login")
Observable<PolicRecordBean> getPolicyRecord(
@Query("id") String id,
@Query("token") String token );
```
多個引數請求
```
@GET("News")
Call<NewsBean> getItem(
@Query("newsId") String newsId,
@QueryMap Map<String, String> map);
```
#2. post請求 -- 大部分為有參,增加安全性
##2.1 post 簡單請求
```
@POST("preservation/login")
Observable<HeadBanner> getHeadBanner(
@Query("token") String token
);
```
##2.2 post 普通請求 Field 與 FormUrlEncoded 聯用
```
@FormUrlEncoded
@POST("preservation/login")
Observable<Loan> loan(
@Field("param") String param,
@Field("sign") String sign,
@Query("token") String token
);
```
## 2.3 多引數-post
```
@FormUrlEncoded
@POST("cos/getPubSignParams")
Observable<TencentCloudParams> getTencentCloudParams(
@FieldMap Map<String, String> params,
@Query("token") String token
);
```
## 2.4 補全url
```
@FormUrlEncoded
@POST("Comments/{newsId}")
Call<Comment> reportComment(
@Path("newsId") String commentId,
@Query("access_token") String access_token,
@Field("reason") String reason);
```
## 2.5 body 相當於多個@Field,以物件的形式提交
```
@POST("cos/getSignParamsNew")
Observable<TencentCloudKeyParamsBean> getTencentCloudParamsSet(
@Body RequestBody body,
@Query("token") String token
);
常見的寫法
2.5.1 自定義 bean
DBean request=new DBean ();
request.setAA(aa);
Gson gson = new Gson();
String param = gson.toJson(request);
RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),param);
HttpUtil.init(HttpUtil.sspHttpUtils().getCustomDetailsList(body, App.TOKEN), new Subscriber<GetCustomBean>() {
@Override
public void onCompleted() { }
@Override
public void onError(Throwable e) { }
@Override
public void onNext(GetCustomBean getCustomBean) {}
2.5.2 使用jsonobject
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("AA", aa);
} catch (JSONException e) {
e.printStackTrace();
}
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), jsonObject.toString());
HttpUtil.init(HttpUtil.sspHttpUtils().login(requestBody), new Subscriber<DBean>() {
@Override
public void onCompleted() { }
@Override
public void onError(Throwable e) { }
@Override
public void onNext(DBean bean) {}
2.5.3 使用map
Map map=new HashMap();
map.put("AA",aa);
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), new Gson().toJson(map));
HttpUtil.init(HttpUtil.sspHttpUtils().login(requestBody), new Subscriber<DBean>() {
@Override
public void onCompleted() { }
@Override
public void onError(Throwable e) { }
@Override
public void onNext(DBean bean) {}
```
## 2.6 加請求頭 Headers
>@Headers 用於新增固定請求頭,可以同時新增多個。通過該註解新增的請求頭不會相互覆蓋,而是共同存在
@Header 作為方法的引數傳入,用於新增不固定值的Header,該註解會更新已有的請求頭
```
@Headers("secret:AA")
@POST("customer/login")
Observable<DBean> getDB(
@Body RequestBody body,
@Query("token") String token,
@Query("sign") String sign
);
@Headers("Cache-Control: max-age=120")
@GET("請求地址")
Observable<HttpResult> getInfo();
或者
@GET("請求地址")
Observable<HttpResult> getInfo(@Header("token") String token);
```
## 2.7 part 上傳文字+檔案
>使用Retrofit+RxJava實現網路請求 https://www.jianshu.com/p/092452f287db
```
1)上傳單個文字和單個檔案
@Multipart
@POST("請求地址")
Observable<HttpResult> upLoadTextAndFile(@Part("textKey") RequestBody textBody,
@Part("fileKey\"; filename=\"test.png") RequestBody fileBody);
第一個引數用於傳文字,
> --- @Part("textKey")中的"textKey"為文字引數的引數名。
> --- RequestBody textBody為文字引數的引數值,生成方式如下:
> RequestBody textBody = RequestBody.create(MediaType.parse("text/plain"), text);
第二個引數用於傳檔案,
> --- @Part("fileKey"; filename="test.png")
> 其中的"fileKey"為檔案引數的引數名(由伺服器後臺提供)
> 其中的"test.png"一般是指你希望儲存在伺服器的檔名字,傳入File.getName()即可
> --- RequestBody fileBody為檔案引數的引數值,生成方法如下:
> RequestBody fileBody = RequestBody.create(MediaType.parse("image/png"), file);
>
> (這裡檔案型別以png圖片為例,所以MediaType為"image/png",
> 不同檔案型別對應不同的type,具體請參考[http://tool.oschina.net/commons](http://tool.oschina.net/commons))
```
上傳多個文字和多個檔案(通過Map來傳入)
```
@Multipart
@POST("")
Observable<HttpResult> upLoadTextAndFiles(@PartMap Map<String, RequestBody> textBodyMap, @PartMap Map<String, RequestBody> fileBodyMap);
第一個引數用於傳文字,
Map的key為String,內容請參考上方“上傳文字和單個檔案”中@Part()裡的值。
Map的value值為RequestBody,內容請參考上方“上傳文字和單個檔案”中RequestBody的生成。
第二個引數用於傳檔案,
Map的key為String,內容請參考上方“上傳文字和單個檔案”中@Part()裡的值。
Map的value值為RequestBody,內容請參考上方“上傳文字和單個檔案”中RequestBody的生成。
```
另外補充多一種上傳方式(2018/07/16),以上傳多個文字和多個檔案為例
```
@POST("")
Observable<HttpResult> upLoadTextAndFiles(@Body MultipartBody multipartBody);
MultipartBody 的生成方式如下:
MultipartBody.Builder builder = new MultipartBody.Builder();
//文字部分
builder.addFormDataPart("fromType", "1");
builder.addFormDataPart("content", "意見反饋內容");
builder.addFormDataPart("phone", "17700000066");
//檔案部分
RequestBody requestBody = RequestBody.create(MediaType.parse("image/jpg"), file);
builder.addFormDataPart("image", file.getName(), requestBody); // “image”為檔案引數的引數名(由伺服器後臺提供)
builder.setType(MultipartBody.FORM);
MultipartBody multipartBody = builder.build();
下載檔案
//下載大檔案時,請加上@Streaming,否則容易出現IO異常
@Streaming
@GET("請求地址")
Observable<ResponseBody> downloadFile();
//ResponseBody是Retrofit提供的返回實體,要下載的檔案資料將包含在其中
```
part --- eg:
```
/**
* 文字引數轉換
* @param value
* @return
*/
public static RequestBody toRequestBody(String value) {
RequestBody body = RequestBody.create(MediaType.parse("multipart/form-data"), value);
return body;
}
@Multipart
@POST("/Card")
Observable<SubmitEditVisitingCardInfoBean> submitEditVisitingCardInfo(@Part("staffNumber") RequestBody staffNumber,
@Part MultipartBody.Part headimg,
@Part("workAge") RequestBody workAge,
@Part("wxNum") RequestBody wxNum,
@Part MultipartBody.Part wximg,
@Part("tags") RequestBody tags,
@Part("sex") RequestBody sex,
@Part("proSeleIdList") RequestBody proSeleIdList);
private MultipartBody.Part wxBodyP;
private MultipartBody.Part headBodyP;
File head = new File(currentHeadImgUri.getPath());
RequestBody headBoyd = RequestBody.create(MediaType.parse("multipart/form-data"), head);
headBodyP = MultipartBody.Part.createFormData("headImgFile", "head.png", headBoyd);
File wx = new File(currentRqCodeUri.getPath());
RequestBody wxBody = RequestBody.create(MediaType.parse("multipart/form-data"), wx);
wxBodyP = MultipartBody.Part.createFormData("wx2DImgFile", "wxxx.png", wxBody);
HttpUtil.init(HttpUtil.sspHttpUtils().submitCardInfo(
toRequestBody(staf),
headBodyP,
toRequestBody(getWorkAge()),
toRequestBody(getWxNum()),
wxBodyP,
toRequestBody(getTags()),
toRequestBody(getSex()),
toRequestBody(getSelectedRecommendId())
), new Subscriber<CardInfoBean>() {
@Override
public void onCompleted() { }
@Override
public void onError(Throwable e) { }
@Override
public void onNext(CardInfoBean card) {}
```