kotlin - GraphQL服务器端流式实现

标签 kotlin graphql

因此,过去我能够创建一个REST端点,并使它能够流式传输大文件。我使用Java和Jersey(REST库)进行了此操作。我可以创建一个类似于以下代码的终结点-客户端可以命中它,并且服务器将流出大文件而无需使用大量内存,并且客户端将立即开始下载文件。

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

    return response;
}

现在,我正在尝试弄清楚如何使用GraphQL应用类似的模式。用例有些不同-现在我从数据库而不是文件中提取大型结果集。我有在Kotlin和KGraphQL中构建的GraphQL服务器。从我所做的研究来看,似乎需要发送整个对象作为对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服务器时出现以下异常:

Caused by: com.apurebase.kgraphql.schema.SchemaException: Generic types are not supported by GraphQL, found () -> java.io.ByteArrayInputStream at com.apurebase.kgraphql.schema.structure2.SchemaCompilation.handlePossiblyWrappedType(SchemaCompilation.kt:147) at com.apurebase.kgraphql.schema.structure2.SchemaCompilation.handleOperation(SchemaCompilation.kt:131) at com.apurebase.kgraphql.schema.structure2.SchemaCompilation.handleQueries(SchemaCompilation.kt:112) at com.apurebase.kgraphql.schema.structure2.SchemaCompilation.perform(SchemaCompilation.kt:55) at com.apurebase.kgraphql.schema.dsl.SchemaBuilder.build(SchemaBuilder.kt:26) at com.apurebase.kgraphql.KGraphQL$Companion.schema(KGraphQL.kt:8)



我们在前端使用apollo,所以我觉得我们可以在客户端利用stream指令-我只是不确定如何设计GraphQL解析器来返回流。

有没有一种方法可以流式传输对GraphQL调用的响应?还是我目前必须使用REST?

最佳答案

流响应的最接近GraphQL等效项可能是订阅:https://graphql.org/blog/subscriptions-in-graphql-and-relay/。对我来说,实现您对DB行“事件”的订阅实现的工作似乎很合理。

看来目前KGraphQL中尚未实现:https://github.com/aPureBase/KGraphQL/issues/10

然而,graphql-kotlin项目(https://github.com/ExpediaGroup/graphql-kotlin)的订阅是在spring-boot的基础上实现的:https://expediagroup.github.io/graphql-kotlin/docs/server/subscriptions

如果您习惯 Jersey 并且希望坚持使用它,我们将利用graphql-kotlin的基础库汇总一个单独的实现,以在dropwizard( Jersey 等)基础上实现订阅:https://github.com/trib3/leakycauldron/tree/master/graphql

关于kotlin - GraphQL服务器端流式实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58328920/

相关文章:

kotlin - 为什么引用不同时引用相等检查返回true

junit - 如何使用 gradle 运行 kotlintest 测试?

javascript - 使用 Github GraphQL API 在一个 Promise.All 中获取来自不同数组的结果

javascript - Graphql 通用突变

graphql - 仅在 React 组件挂载上运行 Apollo 查询(没有 queryData 和生命周期)

java - BottomSheetDialogFragment关闭监听器

java - 使用 Kotlin 使用 OkHttp 发送 JSON 数据

javascript - 如何在 GraphQL 中创建自定义对象列表

javascript - ReactJS:TypeError:无法添加/删除密封的数组元素

android - 为全屏 Activity 摆脱不必要的根布局