目前在我们的Android开发中,网络请求大多数都是用Retrofit网络请求框架,或者Retrofit+RxJava等等的一些组合,在实际的开发中,我们的请求方式和参数也是多种多样的,大多数的情况下都是这种的:
GET方式:
@Query
@GET("book/search")
Call<Book> getSearchBook(@Query("q") String name);//name由调用者传入
这就相当于url后面拼接参数一样的;当参数的多的时候就使用map:
@QueryMap
@GET("/helmetServer/sync/syncLabel")
Call<ResponseBody> syncLabel(@QueryMap Map<String, String> map);
或者还有的时候需要替换url中某些字段请求的方式 @Path:
@GET("/helmetServer/yitu/report/{imageId}/{temperature}")
Observable<ResponseBody> faceNetTemperature(@Path("imageId") String imageId,@Path("temperature") String temperature);
POST的请求:
当参数是实体类的时候@Body:
@POST("users/new")
Call<User> createUser(@Body User user);
@Field(POST请求)或者FieldMap:
用于传送表单数据: 不要忘了@FormUrlEncoded,否则会报错
@FormUrlEncoded
@POST("/helmetProxy/login")
Call<ResponseBody> loginHelmet(@FieldMap Map<String, String> requestBody);
@Header/@Headers(POST请求):
用于头部请求添加,三种方式,也可以添加多个:
@GET("user")
Call<User> getUser(@Header("Authorization") String authorization)
@Headers("Cache-Control: max-age=640000")
@GET("user")
Call<User> getUser()
@Headers({
"Accept: application/vnd.github.v3.full+json",
"User-Agent: Retrofit-Sample-App"
})
@GET("user")
Call<User> getUser()
上面的请求头部的参数添加只是正对与接口的,如果整个框架头部都需要的话,就直接在OKHttp的拦截里面去添加,这样就整个网络请求就统一的添加了请求头部,整个看实际情况而定;
@Multipart(POST请求)
用于文件参数上传:
@Multipart
@POST("/helmetServer/file/upload")
Observable<ResponseBody> uploadFile(@Part List<MultipartBody.Part> requestBodyMap);
总结:以上的集中请求方式就是我们平时开发中所熟知的,也是使用最频繁的,可是有的时候,我们的请求需要大量数据作为参数,去传给后台服务器,例如某些批量上传数据的接口,此时以上的方式就显得有点鸡肋了,那我们Android端应该如何去处理呢?
解决思路:
- 首先将批量的数据存储到某个数据或者list对象中;
- 然后将这个对象转换成String的json字符串;
- 最后将json字符串转成RequestBody,请求体;
原生的方法:
// 创建json对象
JSONObject jsonObject = new JSONObject();
// 1个数组参数
JSONArray jsonArray = new JSONArray();
for (String tag : tags) {
jsonArray.put(tag);
}
jsonObject.put("tags", jsonArray);
// 3个字符串参数
jsonObject.put("appId", appId);
jsonObject.put("token", token);
jsonObject.put("clientId", clientId);
String data = jsonObject.toString();
Gson框架方法:
List<CarRecordInfo> recordInforDaoList = DaoManager.getInstance(mContext).getCarRecordData();
List<CarRecordModel> needUploadCarRecord = new ArrayList<>();
if (recordInforDaoList != null && recordInforDaoList.size() > 0) {
for (int i = 0; i < recordInforDaoList.size(); i++) {
if(recordInforDaoList.get(i) != null){
CarRecordModel carRecordModel = new CarRecordModel();
carRecordModel.setInfo(AESUtil.encrypt(getRequestBodyCar(recordInforDaoList.get(i))));
carRecordModel.setPlayDate(AESUtil.encrypt(recordInforDaoList.get(i).getTime()+""));
carRecordModel.setPlateNum(AESUtil.encrypt(recordInforDaoList.get(i).getLicense_plate()));
carRecordModel.setPlateType(AESUtil.encrypt(recordInforDaoList.get(i).getVehicle_type()));
carRecordModel.setBase64(AESUtil.encrypt(recordInforDaoList.get(i).getPlatePath()));
carRecordModel.setDbId(AESUtil.encrypt(recordInforDaoList.get(i).getDbId()));
needUploadCarRecord.add(carRecordModel);
}
}
String data= new Gson().toJson(needUploadCarRecord);
}
以上两种方式就是将数据转成josn字符串,
接下来将json字符串转成RequestBody,传给post请求就ok了:
RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json;charset=UTF-8"), data);
HttpClient.Builder.getHttpService().carReportList(requestBody)
.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
}
});
@POST("/helmetServer/ycyd/reportList")
Call<ResponseBody> carReportList(@Body RequestBody parameter);
好了,到这里基本上就ok 搞定了!希望小小的知识总结,可以给你带来大大的帮助!