Модернизация 2 Многостраничные запросы

Я переношу существующую кодовую базу в Retrofit 2, но имею некоторые проблемы с пониманием нового синтаксиса для запросов Multipart. Я также использую Kotlin, хотя, кроме нескольких синтаксических изменений, я думаю, что это не имеет значения для этого конкретного вопроса.

Вот что я имею прямо сейчас:

val audioDuration = RequestBody.create(null, audioDuration.toString()) val file = RequestBody.create(MediaType.parse("audio/mp4"), File(context.filesDir, filename).absoluteFile) sendAudioChunk(audioDuration, file).enqueue(callback) 

И вот определение API:

 @Multipart @POST("path_to_request") fun sendAudioChunk(@Part("duration") audioDuration: RequestBody, @Part("audio") audioBlob: RequestBody) : Call<ResponseObject> 

В Retrofit 1.9 я использовал TypedString и TypedFile для параметров запроса, и теперь кажется, что нужно использовать RequestBody из OkHttp, но я должен что-то пропускать, поскольку запрос не выполняется правильно.

В конце концов я понял это. Мой веб-сервис ожидает имя файла для загрузки файлов. Похоже, что это новая поддержка Retrofit 2, но можно обойти эту проблему, добавив ее к названному определению параметра.

Подробнее здесь: https://github.com/square/retrofit/issues/1140

TypedString дело в том, что TypedString будет иметь Content-Type «text / plain; charset = UTF-8», где вы вообще не настраиваете Context-Type для параметра audioDuration . Попробуйте установить его в text/plain чтобы получить то же поведение, что и TypedString (по умолчанию для charset будет установлено значение utf-8).

 val audioDuration = RequestBody.create(MediaType.parse("text/plain"), audioDuration.toString()) 

Если это не сработает, вам нужно предоставить дополнительную информацию о том, как «запрос не выполняется правильно». Также будет полезен рабочий запрос, который вы пытаетесь воспроизвести.