java - 使用 Relay Modern 和 GraphQL 上传文件

标签 java graphql multipartform-data graphql-java relaymodern

所以我已经研究了两天,但对 Java 的了解不够,无法完全实现解决此问题的方法。在客户端我发现了一些 excellent user documentation并相信我已经按顺序准备好了正确的部分,但是当涉及到在服务器中处理入站多部分/表单数据时,我有点迷失了。

我的应用程序的基础基于 HowToGraphQL Java我觉得他们在组织代码库方面做得很好,并且使事情变得非常简单易懂。不幸的是,文件上传不是他们涵盖的领域,并且根据 graphql-java 包的维护者,no plans exist to directly support this feature .

但这并不是说这是不可能的。 GraphQL 规范旨在作为指南,社区选择如何调用规范取决于他们。许多人已经成功地合并了文件上传,尽管通常是通过包含 custom middleware

不幸的是,我的障碍可能只是缺乏领域知识。我主要使用 JavaScript 和 Python,并且主要拥有 Java 方面的学术经验。不完全确定从哪里开始,但我想我需要跟踪我认为与 SimpleGraphQLServlet 类相关的响应对象,并找到一种提取入站文件对象的方法。

希望获得更多专家建议或帮助提出解决方案。我还没有在 SO 上找到任何可靠的基于 Java 的代码片段来解决这个问题,因此解决这个问题可能会让其他尝试采用这个平台的人受益。

编辑:

可能找到了一种方法来做到这一点,但仍然没有弄清楚具体细节。在扩展 SimpleGraphQLServlet 类的 GraphQLEndpoint 类中,我们公开了 doPost() 方法。然而,提取数据最终会导致一系列错误,第一个错误是使用 @MultipartConfig 注释解决的,但下一个错误让我再次陷入停滞。 “缺少 MultiPart 请求的内容。”

这个 doPost() 方法似乎是在突变发生后调用的,所以即使我设法提取文件数据,似乎数据也会出现在错误的位置。另外,我想知道丢失的内容是否是突变消耗发布数据的结果,假设它已经到达了。

然而,所有其他参数都完好无损,因此只需访问该文件即可。

最佳答案

遗憾的是,关于 HowToGraphQL 的 Java 教程已经过时了。我正在努力更新它(我是原作者),但这需要时间。 当前的最佳实践是在以模式优先方式工作时直接使用 graphql-java 的 RuntimeWiring*。这里有一些基本文档:http://graphql-java.readthedocs.io/en/v6/schema.html

无论如何,处理文件上传的方式没有改变:将整个 HttpServletRequest 对象或只是二进制部分粘贴到共享上下文中:

graphQL.execute(ExecutionInput.newExecutionInput()
    .query(operation)
    .context(request.getPart("file")) //add the binary to the context
    .build());

稍后,在DataFetcher中,您可以通过以下方式获取它:DataFetchingEnvironment#getContext:

Part file = environment.getContext();
file.getInputStream(); //do something with the binary content

当然,您可以使用其他一些(动态)结构作为上下文,而不是直接使用二进制文件。

这种处理上传的侧面加载方式是使用 JSON 作为传输格式的结果,而 JSON 是文本的。这与文件下载通常在 GraphQL 外部处理的原因相同(其中响应仅包含启动下载所需的 ID 或 URL)。引用服务器实现包括使用相同策略的示例。
据我所知,目前没有非 JSON GraphQL 客户端。

*对于代码优先,graphql-spqr (我的项目)仍然是最方便的方式。

关于java - 使用 Relay Modern 和 GraphQL 上传文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48328285/

相关文章:

java - 命令外壳上的 Java 进程之间的管道工作不可靠

java - 对异常使用泛型是否明智?

go - 将 echo.Context 转换为 context.Context

java - 使用 64 位 Java SDK 和 64 位 Windows 在 C# 中运行用于 JavaAccessability 的示例 Java 应用程序

Java 日志记录 : Log4j Version2. x:显示终端客户端调用方的方法(不是中间日志记录帮助程序方法)

architecture - 将 gRPC 和/或 GraphQL 用于微服务架构

reactjs - Relay 和 GraphQL 是否有替代库?

swift - 发送 Core Data 对象到 post api Alamofire multipartFormData

java - 使用 org.zalando.logbook 打印带有 multipart/form-data 的请求

c++ - 为什么在发送几 block 数据后文件上传停止(使用 multipart/form-data)?