web-dev-qa-db-fra.com

Comment envoyer une requête graphql à appsync de Python?

Comment post une demande graphql via AWS appsync à l'aide de Boto?

En fin de compte, j'essaie d'imiter une application mobile accédant à notre pile Stackless/Cloudformation sur AWS, mais avec Python. Pas javascript ou amplifie.

Le point de douleur primaire est l'authentification; J'ai déjà essayé une douzaine de façons différentes. Ceci l'actuel, qui génère une réponse "401" avec "UNAuthorizedException" et "autorisation refusée", ce qui est vraiment bon en considérant certains des autres messages que j'ai eues. J'utilise maintenant la bibliothèque 'AWS_ReQuestS_Auth' pour faire la pièce de signature. Je suppose que cela me authentifie en utilisant le stock stocké /.aws/credentials de mon environnement local, ou le fait-il?

Je suis un peu confus sur l'endroit où et comment les identités et les piscines de Cognito vont y arriver. Par exemple: disons que je voulais imiter la séquence d'inscription?

De toute façon, le code a l'air assez simple; Je ne grok pas l'authentification.

from aws_requests_auth.boto_utils import BotoAWSRequestsAuth

APPSYNC_API_KEY = 'inAppsyncSettings'
APPSYNC_API_ENDPOINT_URL = 'https://aaaaaaaaaaaavzbke.appsync-api.ap-southeast-2.amazonaws.com/graphql'

headers = {
    'Content-Type': "application/graphql",
    'x-api-key': APPSYNC_API_KEY,
    'cache-control': "no-cache",
}
query = """{
    GetUserSettingsByEmail(email: "john@washere"){
      items {name, identity_id, invite_code}
    }
}"""


def test_stuff():
    # Use the library to generate auth headers.
    auth = BotoAWSRequestsAuth(
        aws_Host='aaaaaaaaaaaavzbke.appsync-api.ap-southeast-2.amazonaws.com',
        aws_region='ap-southeast-2',
        aws_service='appsync')

    # Create an http graphql request.
    response = requests.post(
        APPSYNC_API_ENDPOINT_URL, 
        json={'query': query}, 
        auth=auth, 
        headers=headers)

    print(response)

# this didn't work:
#    response = requests.post(APPSYNC_API_ENDPOINT_URL, data=json.dumps({'query': query}), auth=auth, headers=headers)

Rendements

{
  "errors" : [ {
    "errorType" : "UnauthorizedException",
    "message" : "Permission denied"
  } ]
}
7
John Mee

Construire la réponse de Joseph Warda Vous pouvez utiliser la classe ci-dessous pour envoyer des commandes Appsync.

# fileName: AppSyncLibrary

import requests

class AppSync():
    def __init__(self,data):
        endpoint = data["endpoint"]
        self.APPSYNC_API_ENDPOINT_URL = endpoint
        self.api_key = data["api_key"]
        self.session = requests.Session()

    def graphql_operation(self,query,input_params):

        response = self.session.request(
            url=self.APPSYNC_API_ENDPOINT_URL,
            method='POST',
            headers={'x-api-key': self.api_key},
            json={'query': query,'variables':{"input":input_params}}
        )

        return response.json()

Par exemple dans un autre fichier dans le même répertoire:

import AppSync from AppSyncLibrary

APPSYNC_API_ENDPOINT_URL = {YOUR_APPSYNC_API_ENDPOINT}
APPSYNC_API_KEY = {YOUR_API_KEY}

init_params = {"endpoint":APPSYNC_API_ENDPOINT_URL,"api_key":APPSYNC_API_KEY)

app_sync = AppSync(init_params)

mutation = """mutation CreatePost($input: CreatePostInput!) {
createPost(input: $input) {
  id
  content
 }
}
"""

input_params = {
  "content":"My first post"
}

response = app_sync.graphql_operation(mutation,input_params)

print(response)

Remarque: Cela nécessite que vous activiez l'accès API pour votre API d'Appsync. Vérifiez ceci AWS POST pour plus de détails.

1
Kenton Blacutt