Реализация потоковой передачи на стороне сервера GraphQL - PullRequest
2 голосов
/ 10 октября 2019

Итак, в прошлом мне удавалось создать конечную точку REST и дать ей возможность потоковой передачи больших файлов. Я сделал это, используя Java и Джерси (библиотека REST). Я мог бы создать конечную точку, аналогичную приведенной ниже, - клиент мог поразить ее, и сервер мог бы передавать большие файлы без использования тонны памяти, и клиент немедленно начинал скачивать файл.

@GET
@Path("/getFile")
public Response getFile(){
    InputStream file = getFileStreamFromDB();
    Response response = Response.ok().entity(stream);

    return response;
}

Прямо сейчас я пытаюсь понять, как применить подобный образец, используя GraphQL. Вариант использования немного другой - теперь я извлекаю большие наборы результатов из БД, а не из файлов. У меня есть сервер GraphQL, встроенный в Kotlin и KGraphQL. Из проведенного мною исследования похоже, что мне нужно отправить весь объект в ответ на вызов GraphQL.

В моем примере использования данные отображаются на информационной панели на основе React. В некоторых случаях у нас есть тонна данных, и ответ может быть отправлен клиенту, потому что весь набор результатов должен быть отправлен. Я надеюсь передать данные на панель инструментов, чтобы пользователь мог сразу же начать просматривать некоторые данные, а не ждать 15 или 20 секунд, пока они не отобразятся.

Средство распознавания GraphQL хорошо, если это какой-то объект илистрока:

query("returnString"){
    resolver { -> "this is a string"}
}

Однако, если я пытаюсь вернуть InputStream, как показано ниже:

query("returnStream"){
    resolver { -> ({
            val stream = ByteArrayInputStream("this is a string".toByteArray(Charsets.UTF_8))
            stream
        })
    }
}

При попытке запустить мой сервер GraphQL я получаю следующее исключение:

Причина: com.apurebase.kgraphql.schema.SchemaException: универсальные типы не поддерживаются GraphQL, найдено () -> java.io.ByteArrayInputStream в com.apurebase.kgraphql.schema.structure2.SchemaCompilation.handleTypeperara(SchemaCompilation.kt: 147) в com.apurebase.kgraphql.schema.structure2.SchemaCompilation.handleOperation (SchemaCompilation.kt: 131) в com.apurebase.kgraphql.schema.structure2.SchemaCompilation.handleQueries (SchemaCompilation). com.apurebase.kgraphql.schema.structure2.SchemaCompilation.perform (SchemaCompilation.kt: 55) на com.apurebase.kgraphql.schema.dsl.SchemaBuilder.build (SchemaBuilder.kt: 26) на com.apurebase.kgraphql.KGraphQL $ Companion.schema (KGraphQL.kt: 8)

Мы используем apollo наинтерфейс, поэтому я чувствую, что мы могли бы использовать директиву stream на стороне клиента - я просто не уверен, как спроектировать распознаватель GraphQL для возврата потока.

Есть ли способ, которым я могу передать ответ навызов GraphQL? Или мне сейчас нужно использовать REST для этого?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...