Android中Retrofit网络请求参数总结,包含参数为List数组的情况

本文总结了Android开发中使用Retrofit进行网络请求的各种方式,包括GET、POST、Header、Multipart等,并重点介绍了如何处理参数为List数组的批量数据请求。通过将数据转化为JSON字符串,再转换为RequestBody,实现批量数据的POST请求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

目前在我们的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端应该如何去处理呢?

解决思路:

  1. 首先将批量的数据存储到某个数据或者list对象中;
  2. 然后将这个对象转换成String的json字符串;
  3. 最后将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 搞定了!希望小小的知识总结,可以给你带来大大的帮助!

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值