android — Retrofit 2 Multipart POST-запрос отправляет дополнительные кавычки в переполнение стека

Используя 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

10

Решение

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

Скаляры (примитивы, в штучной упаковке и строки):
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();

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

14

Другие решения

использование 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);
4

Если вы не хотите использовать конвертер, вот что я сделал, чтобы отправить многокомпонентный запрос, содержащий файл изображения и 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)
0
По вопросам рекламы [email protected]