所以我已经研究了两天,但对 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/