2015-10-07 5 views
2

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

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

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> 

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

+0

решение Jake Wharton здесь рекомендуемый способ сделать это; https://stackoverflow.com/questions/38507040/how-to-set-dynamic-filename Вы создаете параметры @Part с параметрами типа MultipartBody.Part, которые могут содержать имя файла. –

ответ

3

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

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

+0

было бы неплохо, если бы вы просто показали пример того, что делать здесь. Мне потребовалось некоторое время прочертить эти потоки, чтобы найти правильное решение, которое не было тем, что многие люди защищают (внедряя его в параметр имени RequestBody, избегая цитаты) –

1

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

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

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

+0

Сделал это, и все еще не работает. Я получаю 200, но сервер видит, что длина сообщения не содержит содержимого. В предыдущей версии модификации содержимое получилось в порядке, и я делаю все остальное одинаково (или, по крайней мере, так думаю). Сервер работает на движке приложения, если это имеет значение. – pedronveloso

+0

У вас есть стенограмма рабочего запроса из вашего старого кода? – iagreen

+0

Мой старый код был этот: http://pastie.org/10465917 – pedronveloso