Retrofti 2: опубликуйте несколько файлов с названиями частей вместе с @FormUrlEncoded formData

У меня есть довольно сложный POST, который я пытаюсь сделать с помощью Retrofit2.

    @Multipart
    @FormUrlEncoded
    @POST("post")
    Call<JSONObject> createPost(
        @Field("name") String name,
        @Part("media_1") MultipartBody.Part mediaOne,
        @Part("media_2") MultipartBody.Part mediaTwo,
        @Part("media_3") MultipartBody.Part mediaThree,
        @Part("media_4") MultipartBody.Part mediaFour,
        @Part("media_5") MultipartBody.Part mediaFive,
        @Header("secret_key") int secretKey
    );

Он содержит различные аспекты, такие как параметр с именем «name», который я обычно думаю размещать с @Field и с @FormUrlEncoded. Я понимаю, что у меня не может быть @Multipart и @FormUrlEncoded одновременно, поэтому я думаю, что хотел бы удалить @FormUrlEncoded из приведенного выше примера кода и заменить @Field на @Part. Это верно?

Затем я получаю исключение: «Параметры @Part, использующие MultipartBody.Part, не должны включать имя части в аннотации». Но я не могу просто удалить @Part ("media_1") и т. Д., Потому что эти названия частей гарантируют, что медиафайл загружен в правильное место. Какое здесь решение?

Это самый сложный вызов Retrofit2, который я когда-либо делал. Спасибо, что нашли время, чтобы просмотреть мой вопрос.

Вот где я использую вызов Retrofit2 на тот случай, если полезно использовать его в качестве контекста:

 file0 = FileUtils.getFile(filePath);
 requestFile0 = RequestBody.create(MediaType.parse("multipart/form-data"), file0);
 body0 = MultipartBody.Part.createFormData("image0", file0.getName(), requestFile0);

 file1 = FileUtils.getFile(constructedLog.getLogImageLocations().get(1));
 requestFile1 = RequestBody.create(MediaType.parse("multipart/form-data"), file1);
 body1 = MultipartBody.Part.createFormData("logImage1", file1.getName(), requestFile1);

 //etc for file2, file3, file4

 Call<JSONObject> call = apiService.getApi().createPost(
            getName(),
            body0,
            body1,
            body2,
            body3,
            body4,
            secretKey
            );

person Boxwood    schedule 06.09.2016    source источник


Ответы (1)


Код для вызова API:

@Multipart
@POST("post")
Call<JSONObject> createPost(
    @Part("name") RequestBody name,
    @Part MultipartBody.Part mediaOne,
    @Part MultipartBody.Part mediaTwo,
    @Part MultipartBody.Part mediaThree,
    @Part MultipartBody.Part mediaFour,
    @Part MultipartBody.Part mediaFive,
    @Header("secret_key") int secretKey
);

File file = new File(yourpathhere);
body0 = MultipartBody.Part.createFormData("media_1", file.getName(), RequestBody.create(MediaType.parse("image/*"), file));

RequestBody name = RequestBody.create(MediaType.parse("text/plain"), yourString);


Call<JSONObject> call = apiService.getApi().createPost(
        name,
        body0,
        body1,
        body2,
        body3,
        body4,
        secretKey
        );

По сути, проблема заключалась в том, что я объявлял имя как в createFormData (), так и в @Part. Вы можете делать только одно или другое.

Я также изменил первый параметр на RequestBody. Если бы вы просто попытались использовать String, по крайней мере, в моем случае, API бы подумал, что это буквально должно быть двойные кавычки вокруг него.

Ссылка на это решение: Retrofit 2.0-beta-2 добавляет буквальные кавычки к значениям MultiPart

person Boxwood    schedule 16.09.2016