Как отправить Список целых чисел вместе с изображением в retrofit2, используя Multipart - PullRequest
0 голосов
/ 30 января 2020

Я пытаюсь загрузить изображение, используя модификацию 2.0. У меня есть несколько других параметров для отправки с данными формы, которые включают Список целых чисел. Объявление моего запроса:

@Multipart
@POST("/api/Add")
    Call<AddResponse> addApi(@Part("Id") RequestBody id,
                             @Part("Name") RequestBody name,
                             @Part("Description") RequestBody description,
                             @Part("Phone") RequestBody phone,
                             @Part MultipartBody.Part logo,
                             @Part("WorkingDays") RequestBody workingDays,
                             @Part("CitiesIDs") RequestBody cities);
public class RetrofitService {

    private static Retrofit retrofit;
    private static final Object LOCK = new Object();
    private static final String BASE_URL = "https://baseurl.app";

    public static Retrofit getRetrofitInstance() {

        OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
        httpClient.addInterceptor(chain -> {
            Request original = chain.request();

            Request.Builder requestBuilder = original.newBuilder()
           .addHeader("Content-Type", "application/json");

            Request request = requestBuilder.build();
            return chain.proceed(request);
        });

        OkHttpClient client = httpClient.build();

        HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
        logging.setLevel(HttpLoggingInterceptor.Level.BODY);
        httpClient.addInterceptor(logging);
        httpClient.readTimeout(60, TimeUnit.SECONDS);
        httpClient.connectTimeout(60, TimeUnit.SECONDS);
        if (retrofit == null) {
            synchronized (LOCK) {
                retrofit = new retrofit2.Retrofit.Builder()
                        .baseUrl(BASE_URL)
                        .client(client)
                        .addConverterFactory(ScalarsConverterFactory.create())
                        .addConverterFactory(GsonConverterFactory.create())
                        .client(httpClient.build())
                        .build();
            }
        }

        return retrofit;
    }

. Этот способ не работает должным образом. Список целых чисел, отправленных отдельно, как показано ниже.

Content-Disposition: form-data; name="CitiesIDs"
Content-Transfer-Encoding: binary
Content-Type: multipart/form-data; boundary=290d2964-526a-48b9-b742-c6a3b547c7d6
Content-Length: 286
--290d2964-526a-48b9-b742-c6a3b547c7d6
Content-Disposition: form-data; name="CitiesIDs"
Content-Length: 1
7
--290d2964-526a-48b9-b742-c6a3b547c7d6
Content-Disposition: form-data; name="CitiesIDs"
Content-Length: 1
8
--290d2964-526a-48b9-b742-c6a3b547c7d6--

Кроме того, чтобы преобразовать список целых чисел в RequestBody, я использовал следующий способ

okhttp3.MultipartBody.Builder citiesRequestBodyBuilder = new MultipartBody.Builder().setType(MultipartBody.FORM);

  for(int i=0; i<citiesIdList.size(); ++i){
  citiesRequestBodyBuilder.addFormDataPart("CitiesIDs", String.valueOf(citiesIdList.get(i)));
   }

Так как метод добавления части данных формы addFormDataPart принимает только строки, поэтому мне пришлось преобразовать целые числа на строку, которая заставляет сервер отвечать следующим сообщением

 {"Success":false,
  "ErrorMessage":"Input string '--290d2964-526a-48b9-b742-c6a3b547c7d6' is not a valid number. Path '', line 1, position 38.",
 "Id":0}

Почтальон, отлично работает enter image description here Так как я могу отправить изображение и список целых чисел, используя Multipart.

Проблема в RequestBody принимает только File, byte [], String, ByteString. Как я могу отправить Список целых чисел с @part.

Спасибо за вашу помощь.

1 Ответ

1 голос
/ 01 февраля 2020

Вы должны использовать MultipartBody.Part только для файла, а другое поле следует использовать для RequestBody.

Удалите приведенный ниже код

for(int i=0; i<citiesIdList.size(); ++i){
  citiesRequestBodyBuilder.addFormDataPart("CitiesIDs", String.valueOf(citiesIdList.get(i)));
   }

Используйте

 // Add other field here
RequestBody description =
            RequestBody.create(
                    okhttp3.MultipartBody.FORM, Gson().toJson(citiesIdList));
...