当前位置: 首页 > 面试题库 >

如何在OkHttpClient中将对象(即UserData)类型的列表添加到MultipartBody

苏季同
2023-03-14
问题内容

我有一个对象的ArrayList我需要放入MultipartBody.Builder中。我尝试使用.addFormDataPart的不同方法,但无法正常工作。这就是我将其放入请求的方式。任何帮助,将不胜感激。谢谢

我在服务器上的JSON格式如下

 {
      "formData": [
        {
          "name": "string",
          "value": {
            any-object(string,file,long....etc)
          }
        }
      ],
      "tripId": "string"
    }

这就是我的做法

private RequestBody getMultipartData(Object postData) {
        MultipartBody.Builder formBody = new MultipartBody.Builder();
        formBody.setType(MultipartBody.FORM);

        ArrayList<UserData> arrayList = null;
        if (postData instanceof OnboardPresenterImpl.TripRequest) {
            OnboardPresenterImpl.TripRequest tripRequest = ((OnboardPresenterImpl.TripRequest) postData);
            formBody.addFormDataPart("tripId", tripRequest.getTripId());
            arrayList = tripRequest.getFormData();

        }

        if (arrayList != null && arrayList.size() > 0) {
            for (int i = 0; i < arrayList.size(); i++) {

                UserData userData = arrayList.get(i);

                String value = userData.getValue().toLowerCase();

                if (value.contains("/") && (value.contains(".png") ||
                        value.contains(".jpeg") || value.contains(".jpg"))) {

                    MediaType type = Util.getMediaType(value);

                    File sourceFile = new File(value);

                    if (sourceFile.exists()) {

                        formBody.addFormDataPart(userData.getName(),
                                sourceFile.getName(),RequestBody.create(type, sourceFile));

                    }
                } else {
                    formBody.addFormDataPart(userData.getName(), value);
                }
            }
        }

       return formBody.build();
    }

问题答案:

几天后,我想出了解决方案

String uploadMultipleFiles(Api api, HashMap<String, ArrayList<File>> fileListMap)
            throws IOException {

        String responseS;
        OkHttpClient timeOut = getOkHttpClient(api.getTimeOut());

        MultipartBody.Builder multipartBuilder = new MultipartBody.Builder()
                .setType(MultipartBody.FORM);
        int j = 0;
        ArrayList<File> fileList;
        for (Map.Entry<String, ArrayList<File>> entry : fileListMap.entrySet()) {
            String key = entry.getKey();
            fileList = entry.getValue();

            multipartBuilder.addFormDataPart("data[" + j + "].name", key);

            if (fileList != null) {
                for (int i = 0; i < fileList.size(); i++) {

                    File fileListRequest = fileList.get(i);

                    if (fileListRequest.exists()) {
                        String ext = CommonUtils.getExtension(fileListRequest.getName());
                        /* Changing Media Type whether JPEG or PNG **/
                        final MediaType MEDIA_TYPE = ext.endsWith("png") ? MEDIA_TYPE_PNG :
                                ext.endsWith("jpg") ? MEDIA_TYPE_JPG : MEDIA_TYPE_JPEG;

                        multipartBuilder.addFormDataPart("data[" + j + "].files[" + i + "]",
                                fileListRequest.getName(),
                                RequestBody.create(MEDIA_TYPE, fileListRequest));

                    }
                }
            }
            j++;
        }
        RequestBody requestBody = multipartBuilder.build();
        Request.Builder requestBuilder = new Request.Builder()
                .url(Objects.requireNonNull(api.getUrl()))
                .post(requestBody);
        buildHeaders(requestBuilder);
        Response response = timeOut.newCall(requestBuilder.build()).execute();
        responseS = response.body().string();
        Log.i(api.getName().name(), responseS);
        return responseS;
    }


 类似资料:
  • 我有一个类来代表一个玩家的手牌。但是,我(在另一个类中)有一个数组列表,我想在其中表示一堆玩家手。问题是我不知道如何在多手牌的数组列表中将一张牌添加到手牌中。我有一个代表卡牌和一副牌的类,效果很好。我只是试图了解如何将对象添加到数组列表中的对象。谢谢!

  • 我想用不同的ID将学生添加到studentList中。我无法在for循环中创建学生,因为创建一个学生需要太长的时间。我发现有一个克隆方法,但学生对象有许多字段(其中大多数引用另一个对象)。有什么想法吗?

  • 问题内容: 据我了解,a 是定义为 一些特定但未知类型 的 列表 。因此,无论此参数的类型是什么,都应该对其进行扩展,因为在Java中,不能有任何不扩展的类型。那么为什么下面的代码没有被编译呢?它如何违反了不变式 问题答案: 可以指向可以存储不同类型对象的任何类型的列表。 您如何看待,例如,让它添加任何对象是否安全?

  • 问题内容: 如果需要在列表中添加枚举属性,如何声明列表?让我们说枚举类是: 我想要做: 需要用什么代替 问题答案: 如果要使用字符串类型,请使用以下命令: 否则,MByD的答案

  • 我的问题是:给出一份人员名单,把所有学生都退回来。 以下是我的类: Person类 学生班级 方法 我收到一个编译错误: 如何使用stream返回列表中的所有学生而不出现此错误。

  • 我是java新手,正在努力克服它。我有类似(< code>String URL,int Score)的数据,我想在数组列表中实现它。我研究了如何在< code>ArrayList或< code>LinkedList中实现多种类型的变量,发现解决方案是从超类创建子类,我创建了这个子类: 我的超级班是: 当我尝试使用添加对象时,我遇到了错误?该错误说: 类型ArrayList中的add(int,MyS