項目中使用 Rxjava 進行網絡請求,請求的方式有 get 請求和 post 請求,而請求中 有時候 須要 請求頭 head,有時候須要 請求 json 串,琳琳種種,梳理下思路:java
#1. get 請求json
@GET("login/sys") ObservablegetTKUrl(); 複製代碼
@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 ); 複製代碼
@FormUrlEncoded @POST("cos/getPubSignParams") Observable<TencentCloudParams> getTencentCloudParams( @FieldMap Map<String, String> params, @Query("token") String token ); 複製代碼
@FormUrlEncoded @POST("Comments/{newsId}") Call<Comment> reportComment( @Path("newsId") String commentId, @Query("access_token") String access_token, @Field("reason") String reason); 複製代碼
@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) {} 複製代碼
@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); 複製代碼
使用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) {} 複製代碼