Как добавить список типа Object (т.е. UserData) в MultipartBody в OkHttpClient

У меня есть ArrayList of Object, который мне нужно поместить в свой 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();
    }

person Rahul    schedule 26.09.2018    source источник
comment
Вы можете отправить тип объекта, используя JSON как строку.   -  person Pratik Butani    schedule 28.09.2018
comment
не могли бы вы показать какой-нибудь пример   -  person Rahul    schedule 28.09.2018
comment
Может быть, это поможет вам. stackoverflow.com/q/19026256/1318946   -  person Pratik Butani    schedule 28.09.2018
comment
это вообще бесполезно, потому что мой формат отправки данных отличается   -  person Rahul    schedule 28.09.2018
comment
@Rahul В бэкэнде есть запрос на завивку   -  person Jatin    schedule 28.09.2018
comment
@Jatin Я не могу создать вышеуказанный формат. Пожалуйста, помогите   -  person Rahul    schedule 01.10.2018


Ответы (1)


Через несколько дней я нахожу решение

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;
    }
person Rahul    schedule 26.07.2019