Rxjava 經常使用的網絡請求幾種方式的書寫

項目中使用 Rxjava 進行網絡請求,請求的方式有 get 請求和 post 請求,而請求中 有時候 須要 請求頭 head,有時候須要 請求 json 串,琳琳種種,梳理下思路:java

#1. get 請求json

無參數-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請求 -- 大部分爲有參,增長安全性bash

##2.1 post 簡單請求服務器

@POST("preservation/login")
    Observable<HeadBanner> getHeadBanner(
            @Query("token") String token
    );
複製代碼

##2.2 post 普通請求 Field 與 FormUrlEncoded 聯用markdown

@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實現網絡請求 www.jianshu.com/p/092452f28…app

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來傳入)ide

@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),以上傳多個文本和多個文件爲例oop

@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) {}
複製代碼
相關文章
相關標籤/搜索