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"
} ]
}
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.