Отправьте файл, используя модификацию, которая соответствует указанному c телу запроса - PullRequest
0 голосов
/ 16 апреля 2020

Можно ли даже отправлять файлы, как показано на скриншоте почтальона ниже? Я знаю, что мы можем отправлять файлы, как если бы они стали объектами верхнего уровня. Примерно так:

@Multipart
@POST("audition/register-member")
Observable<ResponseObject<String>> sendAuditionData(@Part("name") RequestBody name,
                                                   @Part("contact") RequestBody contact,
                                                   @NotNull @Part("district") RequestBody district,
                                                   @Part("estdDate") RequestBody estdDate,
                                                   @Part("reason") RequestBody reason,
                                                   @Part("type") RequestBody type,
                                                   @Part("link") RequestBody link,
                                                   @Part MultipartBody.Part video,
                                                   @Part MultipartBody.Part image
                                                  );
// eg: of creating body
val name = RequestBody.create("multipart/form-data".toMediaType(), fullName)
val imageBody = MultipartBody.Part.createFormData("image", selectedFile?.getName(), fileBody); // fileBody is (ProgressRequestBody impl RequestBody)

Но как нам отправить объект массива members с файлом, как показано ниже в разделе «Почтальон».

enter image description here

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Прежде всего, пожалуйста, создайте один класс данных для этого Json, как это ...

data class ReqAuditionData(

@field:SerializedName("members")
val members: ArrayList<Members>? = ArrayList(),

@field:SerializedName("name")
val name: String = "",

 @field:SerializedName("district")
val district: String = "",

//same for other fields
)

, затем непосредственно поместите этот класс данных в качестве параметра в метод интерфейса ...

@Multipart
@POST("audition/register-member")
Observable<ResponseObject<String>> sendAuditionData(@Body reqAuditionData : ReqAuditionData);
0 голосов
/ 16 апреля 2020

Вот как я реализовал отправку изображения на сервер, используя метод post

api file:

@POST("api/profilepic/")
@Multipart
Call<PostResult> updateProfile(@Header("Authorization") String token,
                                       @Part MultipartBody.Part file,
                                       @Part("value") RequestBody name);

Вызов Api:

File file = new File(files[0]);
RequestBody requestBody = RequestBody.create(MediaType.parse("image/*"), file);
MultipartBody.Part fileUpload = MultipartBody.Part.createFormData("file", file.getName(), requestBody);
RequestBody filename = RequestBody.create(MediaType.parse("text/plain"), file.getName());
retrofit = new Retrofit.Builder()
                        .baseUrl(SERVER_NAME)
                        .client(UnsafeOkHttpClient.getUnsafeOkHttpClient())
                        .addConverterFactory(GsonConverterFactory.create())
                        .build();
                api = retrofit.create(GetRemindersApi.class);
                Call<PostResult> call1 = api.updateProfile("Token " + token, fileUpload, filename);
                call1.enqueue(new Callback<PostResult>() {
                    @Override
                    public void onResponse(@NonNull Call<PostResult> call, @NonNull Response<PostResult> response) {
                        PostResult result = response.body();
                        if (Objects.requireNonNull(result).getResult().equals("success")) {
                            profileImage.setImageBitmap(BitmapFactory.decodeFile(file.getAbsolutePath()));
                        } else {
                            Toast.makeText(ProfileView.this, result.getError(), Toast.LENGTH_SHORT).show();
                        }
                    }

                    @Override
                    public void onFailure(@NonNull Call<PostResult> call, @NonNull Throwable t) {
                        Toast.makeText(ProfileView.this, t.getMessage(), Toast.LENGTH_SHORT).show();
                    }
                });
            });
        });

, и он отлично работает для меня.

...