Как должен выглядеть запрос GraphQL на загрузку файла? - PullRequest
0 голосов
/ 30 октября 2018

Я использую Графен на стороне сервера с кодом, аналогичным коду из документации :

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 Ответ

0 голосов
/ 30 октября 2018

Я отвечу сам. Код скручивания, который я имел, был основан на внешней библиотеке, которая запутала меня до чертиков.

Вот мое решение, которое не требует дополнительной библиотеки:

Код 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 request (составная форма)

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'
...