Передача Java объекта в Retrofit не обрабатывается правильно - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь загрузить массив файлов, заголовок авторизации и объект java.

Проблема заключается в том, как настроен сервер, я не хочу называть аннотацию @Part для своегоDocumentUpdateObject.Есть ли способ разрешить @Part (null) или преобразовать мой пользовательский объект (DocumentUpdateObject) в MultipartBody.Part?Я опубликую несколько примеров, чтобы объяснить лучше.

Массив файлов технически необязателен, поэтому нижеприведенное утверждение отлично работает.

@PUT("document/")
Call<ResponseBody> updateDocument(
        @Header("Authorization") String token,
        @Body DocumentUpdateObject object);

То, что я хотел бы, чтобы функционал был похож нана это:

@Multipart
@PUT("document/")
Call<ResponseBody> updateDocumentDocs(
        @Header("Authorization") String token,
        @Part DocumentUpdateObject object,
        @Part ArrayList<MultipartBody.Part> files);

Что касается второго параметра, если я не дам @Part имя, @Part("object"), то произойдет сбой.Если я даю имя @Part, то бэкэнд не сможет его правильно прочитать.Я хочу прочитать его, как @Body выше.

Есть ли код для преобразования объекта в MultipartBody.Part (если это решит его)?Я видел пару решений, но они, кажется, работают только для простых запросов одной строки.Мой DocumentUpdateObject имеет 5 переменных параметров, включая другой объект с еще 5 переменными параметрами.Я рассмотрел MultipartBody.Builder, но, похоже, он не обрабатывает вложенные объекты.

Редактировать: Это все чтение в ожидании формата JSON

Редактировать 2: В основном я смог получить частьобъекта для отправки, разбив его на части, но последний объект внутри него я не смог обработать должным образом.

//These request bodies send properly
RequestBody defncynbrBody =
            RequestBody.create(deficiencyNbr, MediaType.parse("application/json"));
RequestBody assetBody =
            RequestBody.create(assetnbr, MediaType.parse("application/json"));
RequestBody subassetBody =
            RequestBody.create(subassetnbr, MediaType.parse("application/json"));

//This object down here still is unable to be recieved properly
Gson gson = new Gson();
String json = gson.toJson(add);
RequestBody addBody =
            RequestBody.create(json, MediaType.parse("application/json"));

Редактировать 3

Это делаетне работает должным образом

   Content-Disposition: form-data; name="defncy"
    2019-09-25 10:20:24.123 D/OkHttp: Content-Transfer-Encoding: binary
    2019-09-25 10:20:24.123 D/OkHttp: Content-Type: application/json; charset=utf-8
    2019-09-25 10:20:24.123 D/OkHttp: {"defncytyp":"LOW","descr":"details are here this",
    "duedate":"2019-09-23","maintlogcattyp":"INTR","title":"Newest one"}

Тем не менее, этот работает отлично.

2019-09-25 10:31:58.404 D/OkHttp: Content-Type: application/json; charset=UTF-8
2019-09-25 10:31:58.405 D/OkHttp: {"defncy":{"defncytyp":"LOW","descr":"details are here this",
"duedate":"2019-09-23","maintlogcattyp":"INTR","title":"Newest on"},"assetnbr":4,"defncynbr":18,"subassetnbr":0,"usrs_assigned":0}

1 Ответ

0 голосов
/ 24 сентября 2019

Ваш бэкэнд будет принимать детали одним ключом, в основном на стороне сервера, мы рассматриваем несколько файлов деталей как часть [].
Итак, попробуйте построить ваши объекты детали следующим образом:

@NonNull
private List<MultipartBody.Part> getParts(@NonNull String key, @NonNull List<File> files) {
    final MultipartBody.Builder builder = new MultipartBody.Builder();
    for (File file : files) {
        final RequestBody body = RequestBody.create(MediaType.parse("image/*"), file);
        builder.addFormDataPart(key, file.getName(), body);
    }
    return builder.build().parts();
}

, затем вызовите ваш updateDocumentDocs метод

@Multipart
@PUT("document/")
Call<ResponseBody> updateDocumentDocs(
    @Header("Authorization") String token,
    @Part DocumentUpdateObject object,
    @Part List<MultipartBody.Part> files);
...