AWS Passerelle API - SCRO + POST ne fonctionne pas
De la SCRO est vraiment me rend fou et je suis vraiment d'idées de ce que d'essayer de le faire fonctionner.
J'ai créé un simple APIG Api avec 1 ressource appelée " abc "et a ajouté 2 méthodes OBTENIR et POST à la fois avec Autorisation ensemble de AUCUN et Clé API Nécessaires ensemble de faux, tout déployé à un stade appelé "dev".
Bien sûr, j'ai activé de la SCRO sur les deux méthodes et je vois les 3 en-têtes Access-Control-Allow-Origin, Access-Control-Allow-en-Têtes de et Access-Control-Allow-Méthodes ajouté à la OPTIONS méthode et la Access-Control-Allow-Origin ajouté à la POST et OBTENIR méthodes.
Les deux appels sont mappés à la même lambda fonction que le simple fait de sorties d'un "Bonjour de Lambda" du texte à la console.
Puis j'ai créé une page html simple, j'ai organisé un site web statique sur S3, a pointé un domaine à l'aide de Route53 et commencé à tester l'API à l'aide de jQuery $.ajax pour effectuer les appels.
Tout semble facile, simple et exactement comme expliqué dans les docs, à l'exception de la OBTENIR fonctionne et renvoie le texte à la console comme prévu. Le POST version génère l'erreur suivante:
No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://example.com' is therefore not allowed access. The response had HTTP status code 400.
Le contrôle en amont appel fonctionne et renvoie 200 OK et tous les en-têtes sont là, mais l'appel POST renvoie cette erreur et un 400 Bad Request.
Merci de toute aide est très apprécié, j'espère que l'équipe AWS est de regarder de trop...
Merci les gars.
ÉDITÉ Copiés à partir de Google Chrome:
POST Raw en-Têtes de Requête:
POST /dev/urls HTTP/1.1
Host: kykul1mshe.execute-api.us-east-1.amazonaws.com
Connection: keep-alive
Content-Length: 73
Accept: application/json, text/javascript, */*; q=0.01
Origin: http://example.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36
Content-Type: application/json
Referer: http://example.com/dev.html
Accept-Encoding: gzip, deflate, br
Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
POST Raw en-Têtes de Réponse:
HTTP/1.1 400 Bad Request
Date: Fri, 19 Aug 2016 02:14:16 GMT
Content-Type: application/json
Content-Length: 177
Connection: keep-alive
x-amzn-RequestId: a1160e45-65b2-11e6-9766-cd61e49fbcdb
X-Cache: Error from cloudfront
Via: 1.1 d64756b4df47ce24d6c62b5a8de97e87.cloudfront.net (CloudFront)
X-Amz-Cf-Id: N9mf7apicKbSM_MiZjePbEgZGIFKckWJ3lZljH8iHVKFVTcIIOQuHg==
Cela renvoie 400 Bad Request
OPTIONS Raw en-Têtes de Requête:
Accept:*/*
Accept-Encoding:gzip, deflate, sdch, br
Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Access-Control-Request-Headers:accept, content-type
Access-Control-Request-Method:POST
Connection:keep-alive
Host:kykul1mshe.execute-api.us-east-1.amazonaws.com
Origin:http://example.com
Referer:http://example.com/dev.html
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36
OPTIONS Raw en-Têtes de Réponse:
Access-Control-Allow-Headers:Content-Type,X-Amz-Date,Authorization,X-Api-Key,Cache-Control,X-Requested-With
Access-Control-Allow-Methods:POST,OPTIONS
Access-Control-Allow-Origin:*
Connection:keep-alive
Content-Length:79
Content-Type:application/json
Date:Fri, 19 Aug 2016 02:14:16 GMT
Via:1.1 d64756b4df47ce24d6c62b5a8de97e87.cloudfront.net (CloudFront)
X-Amz-Cf-Id:KpGEDmIuf5RHcUnBWuA3oEMZgWHwrjy3SpLuOflRhAD8IIx5vyKGSw==
x-amzn-RequestId:a10bae11-65b2-11e6-bcf7-63b49c24629e
X-Cache:Miss from cloudfront
Cela renvoie 200 OK
- Salut, je suis de la passerelle api. Je ne vois rien de mal avec la façon dont vous l'installation de votre api. Pourriez-vous mettre à jour avec les premières demandes? Qui va aider au débogage.
- Merci pour la réponse @AbhignaNagaraja - j'ai mis à jour le post avec les en-têtes je suis sous Google Chrome (j'ai juste caché le véritable nom de domaine).
Vous devez vous connecter pour publier un commentaire.
Ok, j'ai trouvé l'origine du problème, qui se trouve être totalement indépendants de la APIG, et confirme ce que @AbhignaNagaraja mentionné, que mon APIG a été correctement configuré.
La question est en fait de la façon que j'appelle jQuery.ajax, j'ai pensé que c'était assez intelligent pour convertir mes paramètres d'une chaîne JSON quand contentType est "application/json".
Il me semble que j'avais manuellement stringify le JSON params plutôt que de passer un JSON et ayant jQuery stringify il.
Donc, c'est le mauvais call:
Et c'est le droit d'appel:
Cela peut être un conseil si vous déboguez un tel problème avec la SCRO: il suffit de télécharger l'AWS APIG SDK et essayez d'exécuter l'appel à l'aide de la apigClient fourni par AWS et de comparer les en-têtes avec ceux que vous obtenez avec votre client personnalisé.
Lors de l'examen de la 2 ensembles de têtes que j'ai obtenu avec jQuery et apigClient, j'ai remarqué que la Demande de la Charge utile était différent et c'est comment j'ai réalisé que le format était mal, alors le 400 code et la Pas de "Access-Control-Allow-Origin' en-tête est présent tous les sens.
J'espère que cette aide.
J'ai eu un problème similaire, mais avec lambda proxy intégration:
De la SCRO activé sur AWS Passerelle API à l'aide du navigateur
lambda-proxy intégration activé
Lors de l'utilisation de la lambda proxy intégration, vous pouvez revenir en-têtes personnalisés à partir de l'intérieur du code de la lambda:
Cette façon, vous obtenez de la SCRO en-tête envoyé.
Je pense qu'il pourrait y avoir une meilleure façon de l'obtenir pour fonctionner avec le lambda de proxy intégration sans couplage de la SCRO à l'intérieur du code de la lambda, s'il vous plaît laissez-moi savoir si vous savez.
Si vous utilisez un proxy de l'intégration de l'API de la Passerelle, puis l'activation de la SCRO à partir de la Passerelle API ne fonctionne pas. Vous devez définir l'en-Tête "Access-Control-Allow-Origin" de votre Lambda code lui-même.
Sa mentionnés dans le doc.
Python échantillon de code:
J'ai eu un problème similaire et il n'avait rien à voir avec la façon que l'API a été configuré ou la demande POST que je faisais sur le front-end. Qu'est-ce résolu le problème pour moi a été le déploiement de l'API sur AWS Passerelle API. Une fois que vous créez une méthode de l'API et des ressources, et de les attacher à une fonction lambda, ils ne sont pas auto deploy.
Vous devez cliquez sur "Actions" puis "Déployer API" pour accéder à ces MicroServices partir du front-end.
pour résoudre ce je vous présente ma config de la configuration après en apy passerelle
Option de méthode - Intégration de Réponse - en-Têtes de Cartographie
Méthode Post - Intégration De Réponse - En-Têtes De Cartographie
J'espère que cela vous aide à
Il y a eu beaucoup de messages que vous assurez-vous que la fonction lambda est de retour approprié de la SCRO en-têtes, et qu'ils sont corrects. Cependant, il est également critique que l'objet json est stringified à l'aide de JSON.stringify(). Il semble que le Facteur fait ça pour nous, donc c'est trompeur quand le Facteur de demande et le $.ajax demande d'envoyer le même objet json; pourtant, on réussit et on échoue.
J'ai aussi été coincé dans cette erreur, et après avoir creusé, j'ai constaté que non
2XX
réponses, l'API n'était pas de donnerAccess-Control-Allow-Origin
tête dans la réponse. Par conséquent, si laOPTION
méthode et réussis (2XX
) les réponses a ce titre, le4XX
et5XX
n'a pas. On peut également confirmer ce à l'aide de Facteur et d'inspecter les en-têtes de la mauvaise réponse.Après peaufiner avec la configuration que j'ai fait en sorte de retour cet en-tête dans toutes les réponses.