В Ktor, как я могу передать поток InputStream в тело запроса HttpClient? - PullRequest
0 голосов
/ 21 июня 2019

Я использую Ktor 1.2.2 , и у меня есть объект InputStream, который я хочу использовать в качестве тела для запроса HttpClient, который я записываю вниз.Вплоть до Ktor 0.95 существовал этот InputStreamContent объект, который, казалось, делал именно это, но был удален из Ktor в версии 1.0.0 (к сожалению, не мог понять, почему).

Я могу заставить его работать, используя ByteArrayContent (см. Код ниже), но я бы предпочел найти решение, которое не требует загрузки всего InputStream в память ...

ByteArrayContent(input.readAllBytes())

ЭтоКод - это простой тестовый пример, который имитирует то, чего я пытаюсь достичь:

val file = File("c:\\tmp\\foo.pdf")
val inputStream = file.inputStream()
val client = HttpClient(CIO)
client.call(url) {
      method = HttpMethod.Post
      body = inputStream // TODO: Make this work :(
    }
// [... other code that uses the response below]

Дайте мне знать, если я пропустил какую-либо соответствующую информацию,

Спасибо!

1 Ответ

0 голосов
/ 21 июня 2019

Единственный API (который я нашел ...) в Ktor 1.2.2 - это потенциальная отправка запроса, состоящего из нескольких частей, который потребует от вашего принимающего сервера такой возможности, но он поддерживает прямой InputStream.

Из их документов:

val data: List<PartData> = formData {
    // Can append: String, Number, ByteArray and Input.
    append("hello", "world")
    append("number", 10)
    append("ba", byteArrayOf(1, 2, 3, 4))
    append("input", inputStream.asInput())
    // Allow to set headers to the part:
    append("hello", "world", headersOf("X-My-Header" to "MyValue"))
}

Как говорится, я не знаю, как это работает внутри, и, вероятно, все еще загружает в память весь поток.

Метод readBytes буферизуется, поэтому он не будет занимать всю память.

inputStream.readBytes()
inputStream.close()

Как примечание, вам все равно необходимо закрыть inputStream большинством методов для InputStreams

Ktor Source:https://ktor.io/clients/http-client/call/requests.html#the-submitform-and-submitformwithbinarydata-methods

Котлин Источник: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/java.io.-input-stream/index.html

...