GraphQL 文件上传请求应该是啥样的?

Posted

技术标签:

【中文标题】GraphQL 文件上传请求应该是啥样的?【英文标题】:How should a GraphQL request for file upload look like?GraphQL 文件上传请求应该是什么样的? 【发布时间】:2019-04-03 08:03:54 【问题描述】:

我在服务器端使用Graphene,其代码与documentation中的代码相似:

class UploadFile(graphene.ClientIDMutation):
     class Input:
         pass
         # nothing needed for uploading file

     # your return fields
     success = graphene.String()

    @classmethod
    def mutate_and_get_payload(cls, root, info, **input):
        # When using it in Django, context will be the request
        files = info.context.FILES
        # Or, if used in Flask, context will be the flask global request
        # files = context.files

        # do something with files

        return UploadFile(success=True)

一切都清楚了,但是请求应该是什么样子?

我看到有人建议使用 multipart/form-data,但是 AFAIK 需要额外的层来解析多部分请求,所以这可能不是我需要的......或者是吗? :

curl -X "POST" "http://127.0.0.1:5001/graphql" \
     -H 'Content-Type: multipart/form-data; boundary=----GraphQLFileUpload' \
     -F "operations=\"query\":\"mutation ($files: [Upload!]!) uploadFile(selfie: $file) status\",\"variables\":" \
     -F "map=\"x\":[\"variables.files.x\"]" \
     -F "x=@/tmp/dummy.jpg "

【问题讨论】:

【参考方案1】:

我会自己回复。我的 curl 代码是基于一个外部库,这让我很困惑。

这是我不需要任何额外库的解决方案:

Python 服务器代码(石墨烯):

class UploadImage(graphene.Mutation):
    class Arguments(object):
        file = graphene.String(required=True)

    status = graphene.Boolean()

    def mutate(self, info, file):
        img = info.context.files[file].read()
        # more stuff
        return UploadImage(status=True)

Curl 请求(多部分形式)

curl -X POST http://localhost:5001/graphql \
     -H 'content-type: multipart/form-data; boundary=----GraphQlFileUpload' \
     -F 'query=mutation uploadImage(file: "photo") status' \
     -F 'photo=@selfie.jpg'

【讨论】:

..但将文件作为 base64 字符串发送要容易得多。

以上是关于GraphQL 文件上传请求应该是啥样的?的主要内容,如果未能解决你的问题,请参考以下文章

对象对象的 GraphQL 模式/解析器是啥样的?

ASP采用multipart/form-data方式上传数据,数据的结构是啥样的?

在 graphql-yoga 中返回枚举的解析器函数是啥样的?

我的 json 应该是啥样的?使用 Web 套接字发送消息

“版本文件”是啥样的?

Unity 项目的 .gitignore 文件是啥样的?