Retrofit 2 Многостраничный запрос POST отправляет дополнительные кавычки в PHP

Используя Retrofit 2.0.1, в моем API-интерфейсе, определенном в приложении Android, есть функция вызова:

@Multipart
@POST("api.php")
Call<ResponseBody> doAPI(
  @Part("lang") String lang,
  @Part("file\"; filename=\"image.jpg") RequestBody file
);

Я отправляю запрос следующим образом:

Call call = service.doAPI( "eng", imageFile);

где imageFile - это RequestBody, созданный с помощью объекта File. У части загружаемого изображения нет проблем, а часть @Part("lang") String lang получила дополнительные кавычки на сервере.

На стороне PHP написано следующее:

$lang = trim($_POST['lang']);

который возвращает "eng". Почему добавлена ​​двойная кавычка, окруженная строкой?

конечно, я могу разделить конечные и ведущие двойные кавычки, но это странно сделать это


Связанный выпуск: https://github.com/square/retrofit/issues/1210

Ответ 1

Для вашей проблемы используйте в качестве документации

Scalaры (примитивы, в штучной упаковке и строка): com.squareup.retrofit2: конвертер-скаляры

Итак, добавьте compile 'com.squareup.retrofit2:converter-scalars:2.0.1' в build.gradle файл

Тогда...

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl(API_URL_BASE)
    .addConverterFactory(ScalarsConverterFactory.create())
    //.addConverterFactory(GsonConverterFactory.create())
    .build();

Надеюсь, что это поможет!

Ответ 2

Используйте RequestBody для всех ваших параметров. Пожалуйста, перейдите ниже кода!

File file = new File(imagePath);
RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);
MultipartBody.Part imageFileBody = MultipartBody.Part.createFormData("media", file.getName(), requestBody);
RequestBody id = RequestBody.create(MediaType.parse("text/plain"),addOfferRequest.getCar_id());
ApiCallback.MyCall<BaseResponse> myCall = apiRequest.editOfferImage(imageFileBody,id);

Используйте RequestBody класс Retrofit вместо строки

@Multipart
@POST(ApiURL)
ApiCallback.MyCall<BaseResponse> editOfferImage(@Part MultipartBody.Part imageFile,@Part("id") RequestBody id);

Ответ 3

Если вы не хотите использовать конвертер, то, что я сделал для отправки многочастного запроса, содержащего файл изображения и 2 строки:

@Multipart
@POST("$ID_CHECK_URL/document")
fun postMultipart(@Part imageFile: MultipartBody.Part, @Part string2:  MultipartBody.Part, @Part string2:  MultipartBody.Part)

И называя это так:

    val body = RequestBody.create(MediaType.parse("image/jpg"), file)
    val imageFilePart = MultipartBody.Part.createFormData("file", file.name, reqFile)

    val string1Part = MultipartBody.Part.createFormData("something", "string 1")

    val string2Part = MultipartBody.Part.createFormData("somethingelse", "string 2")

    service.postDocument(imageFilePart, string1Part, string2Part)

Ответ 4

Я столкнулся с этим сегодня в своем проекте, и вот как я решил это. Я изменил @Part для моей строки и других примитивных значений на @Query, а для файла (в моем случае image) я использовал @Part. Похоже, @Query обрабатывает строки иначе, чем @Part.

Поэтому мой ответ на оригинальный вопрос будет выглядеть следующим образом:

@Multipart
@POST("api.php")
Call<ResponseBody> doAPI(
  @Query("lang") String lang,
  @Part("file\"; filename=\"image.jpg") RequestBody file
);

Это должно отправлять строковые значения без нежелательных кавычек. К сожалению, я не могу объяснить, почему это работает, это связано с кодированием данных @Part.