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.