有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用Relay Modern和GraphQL上传java文件

所以我已经在这方面做了两天了,但对Java还不够精通,无法完全实现解决这个问题的方法。在客户端,我发现了一些excellent user documentation,并且相信我已经准备好了适当的部分,但是当涉及到在服务器中处理入站多部分/表单数据时,我有点不知所措

<我的应用程序的基础是基于HowToGraphQL Java教程,因为我觉得他们组织了他们的代码库并使事情变得非常简单易懂。不幸的是,文件上传并不是他们所涉及的领域,而且根据GraphQLJava包的维护者,no plans exist to directly support this feature

然而,这并不是说这是不可能的。GraphQL规范是一个指南,社区如何选择调用规范取决于他们。许多人已经成功地将文件上传合并在一起,尽管通常是通过加入custom middleware

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

如果能提供更多的专家建议或帮助,我们将不胜感激。我还没有找到任何可靠的基于Java的代码段来解决这个问题,所以解决这个问题可能会让其他尝试采用这个平台的人受益

编辑:

可能找到了这样做的方法,但仍然没有解决具体问题。在扩展SimpleGraphQLServlet类的GraphQLEndpoint类中,我们公开了doPost()方法。然而,提取数据最终会导致一系列错误,第一个错误通过@MultipartConfig注释解决,下一个错误让我再次陷入停滞。“缺少多部分请求的内容。”

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

但是,所有其他参数都完好无损地到达,因此只需访问此文件即可


共 (2) 个答案

  1. # 1 楼答案

    目前,对我来说,不幸的是,该解决方案并不完全遵循我所考虑的最佳实践,使用上传、发送多部分/表单数据,然后在服务器上注入中间件。然而,我能够传输文件数据,所以这是一个足够好的开始

    最终,我选择将上传的文件编码为base64,然后通过GraphQL变异以字符串类型发送数据,然后在接收到base64字符串后,我就能够对其进行解码

    现在我看到的只是传输的文件内容,而不是元数据。由于一些元数据对我来说很有价值,因此需要将其与base64字符串一起发送,或者我只是忽略了这个元素,它确实存在

    无论哪种方式,我都会在解决这个问题时留下一些我发现有用的资源,如果其他人遇到这个问题,我可能会发现这些资源很有用。我不认为我目前的解决方案是真正的答案,所以随着这些包的发展,我们可能会看到更好的方法来通过Relay/graphql-java上传文件

    How to convert file to base64 in JavaScript?

    Decode Base64 data in Java

  2. # 2 楼答案

    遗憾的是,关于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之外处理的原因(在GraphQL中,响应仅包含和ID或启动下载所需的URL)。参考服务器实现包括使用相同策略的示例
    据我所知,目前还没有非JSON GraphQL客户端

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