2015-10-02 12 views
7

Hat jemand das AWS API Gateway mit einem Angular.js-Frontend arbeiten lassen? Ich habe eine Lambda-Funktion, die über eine POST-Methode im API-Gateway verfügbar gemacht wird. Ich habe die Header wie in diesem Dokument angegeben: http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors.htmlAWS API-Gateway mit Angular

Ich habe es in Postman getestet und es funktioniert super. Ich musste nichts Besonderes tun, aber wenn ich den $http.post() Anruf mache, bekomme ich nur No 'Access-Control-Allow-Origin' Header ist auf der angeforderten Ressource vorhanden. Origin http://localhost:9000 ist daher nicht erlaubt. Die Antwort hatte als Antwort.

+0

Was ist Ihr Endpunkt URL? Wenn es sich nicht um localhost handelt, können Sie aufgrund von CORS-Beschränkungen (https://en.wikipedia.org/wiki/Cross-origin_resource_sharing) keine Anforderungen stellen. Sie müssen entweder Ihre Anfragen per Proxy übertragen oder eine Anfrage von derselben URL wie Ihr Ziel anfordern. –

+0

Welcher Wert ist Access-Control-Allow-Origin im API-Gateway (sowohl der Beitrag als auch die Optionen) – Luc

+3

'*', genau wie in dem Dokument, das ich verlinkt habe. Dasselbe gilt sowohl für OPTIONS- als auch für POST-Methoden – dudemonkey

Antwort

4

Ich habe derzeit eine POST-Funktion über API-Gateway und Lambda, die von einem Angular-Client mit CORS zugegriffen wird. Während ich nicht weiß, was Ihre Konfiguration ist, kann ich alle meine relevanten Einstellungen in der Hoffnung teilen, dass Sie vielleicht etwas finden, was Sie verpasst haben. Die Aktivierung von CORS ist im Moment sehr schmerzhaft (und hoffentlich wird Amazon daran arbeiten, das Problem zu beheben), was in vielen Bereichen mit ziemlich schlechter Dokumentation viele kleine Schritte erfordert.

Ich habe 2 Methoden (OPTIONS und POST) für meine Ressource, und ich werde die entsprechenden Einstellungen für jede Aktie:

POST:
Methode anfordern: Nichts Besonderes. Im Fall meines Endpunkts habe ich eine Option unter Anforderungswege für einen meiner Routenparameter. Ich verwende keine Abfragezeichenfolge, daher ist die URL-Abfragezeichenfolge leer. HTTP Request Headers ist ebenfalls leer.

Integration Anfrage:
Integration Typ: Lambda Mapping-Vorlagen: Ich habe eine (application/json) mit einer Vorlage die entsprechenden Werte aus der Anfrage Körper und Routenparameter meiner Lambda-Funktion zu übergeben.

Antwort der Methode:
Erweitern Sie das Feld mit 200 Statuscodes. Fügen Sie eine Kopfzeile für "Access-Control-Allow-Origin" hinzu und klicken Sie auf das Häkchen, um es zu speichern. Möglicherweise müssen Sie dies für andere Statuscodes tun, die Sie möglicherweise haben.

Integrationsantwort:
Erweitern Sie das 200-Antwortstatusfeld. Ändern Sie unter Mapping-Zuordnungen den Zuordnungswert, um '*' zu enthalten. Die einfachen Anführungszeichen sind erforderlich. Möglicherweise müssen Sie dies für andere Integrationsantworten tun, die Sie möglicherweise haben.

OPTIONEN:
Methode anfordern:
Nichts Besonderes, genau wie die Methode POST.

Integrationsanfrage:
Ich habe es gesetzt, um Integration zu verspotten. Laut Amazon spielt es keine Rolle, also setze ich es nur so, dass alles, was wir wirklich tun müssen, 200 mit den entsprechenden Headern antwortet. Keine Zuordnungsvorlagen

Antwort der Methode:
Erweitern Sie das Feld mit 200 Statuscodes. Fügen Sie die folgenden drei Antwortheader hinzu und speichern Sie sie mit dem Kontrollkästchen: Access-Control-Allow-Header, Access-Control-Allow-Methoden, Access-Control-Allow-Origin. Es sind keine anderen Statuscodes vorhanden.

Integrationsantwort:
Erweitern Sie das 200-Antwortstatusfeld.Die Regex ist leer (auf Standard gesetzt) ​​und diese Methode hat nur eine Antwort von 200. Erweitern Sie die Headerzuordnungen und setzen Sie die Header auf die folgenden Zuordnungswerte:

Access-Control-Allow-Headers: 'Content-Type,X-Amz-Date,Authorization,X-Requested-With' 
Access-Control-Allow-Methods: 'GET,POST,OPTIONS'  
Access-Control-Allow-Origin: '*' 

Es gibt keine Zuordnungsvorlagen.

Dann stellen Sie Ihre API bereit. Hoffentlich erlaubt es jetzt CORS-Anfragen. Ich habe genau das gleiche Problem wie bei Ihnen festgestellt, und ich bin mir ziemlich sicher, dass der X-Requested-With-Wert in Access-Control-Allow-Headers fehlte.

+0

Diese Antwort ist perfekt. Die Schaltfläche "Enable CORS" in der Konsole überschreibt alles, was im Moment gespeichert ist. Ich habe ein Ticket mit Unterstützung, aber bis das behoben ist, funktioniert das. – Charx

+0

Wenn Sie ein Video-Tutorial von diesem machen, gebe ich Ihnen $ 20 in Bitcoin – Mike

0

Da Ihr Fehler besagt, dass auf der angeforderten Ressource kein 'Access-Control-Allow-Origin'-Header vorhanden ist. " es klingt wie, wenn Sie versuchen, die API von Angular aufzurufen, erhält es nicht den Access-Control-Allow-Origin-Header, der eingerichtet wurde, als Sie den Amazon-Dokumenten folgten.

Zuerst würde ich überprüfen, dass Sie die richtige URL für die API aufrufen. Amazon zeigt dies auf dem Stufenbildschirm an, aber Sie müssen den Stufennamen an die URL anhängen, die er Ihnen zeigt. Also, wenn Sie auf die „prod“ Bühne im Einsatz und sie zeigen

https://xyz.execute-api.us-west-2.amazonaws.com/my-api 

Sie müssen

nennen
https://xyz.execute-api.us-west-2.amazonaws.com/my-api/prod 

Als nächstes würde ich versuchen, das OPTIONS-Methode auf Ihrem API von Postbote aufrufen. Nachdem Sie die POST-Methode in OPTIONS geändert und die API aufgerufen haben, überprüfen Sie die Kopfzeile im Postman-Ergebnisbereich. Sie wollen, dass die folgend in dort sehen:

Access-Control-Allow-Methods → POST,OPTIONS 
Access-Control-Allow-Origin → * 

Wenn Sie nicht in der Lage sind die in der Antwort, überprüfen Sie die Methode Antwort unter der OPTIONS-Methode in Ihren API zu sehen. Stellen Sie sicher, dass diese Header für die 200-Antwort hinzugefügt werden.

Als letztes Ergebnis können Sie versuchen, die Schaltfläche "Enable CORS" zu verwenden, die Amazon kürzlich hinzugefügt hat. Wählen Sie Ihre Ressource in der linken Baumansicht und suchen Sie nach der Schaltfläche "CORS aktivieren" oben rechts. Klicken Sie darauf, und AWS wird alle mit CORS verbundenen Methoden erneut erstellen.

Ich hoffe, dass einige dieser Schritte helfen!

7

Api Gateway-Team hier.

Ich hoffe, Sie haben jetzt die neue Funktion 'CORS aktivieren' in der Konsole ausgecheckt. Selbst wenn sich Ihr Entwicklungsworkflow außerhalb der Konsole befindet, können Sie schnell eine Test-API einrichten und die Header-Konfigurationen ansehen, die die Konsole für Sie konfiguriert, und diese dann in Ihre Swagger-Def-Lösung oder die von Ihnen entwickelte Lösung kopieren.

Das Dokumenthandbuch sollte in beiden Fällen weiterhin gelten. Sie benötigen die drei Header: Access-Control-Allow-Methoden, Access-Control-Allow-Origin und Access-Control-Allow-Header. Die Werte davon hängen von Ihrer API ab.

Wenn Sie mir die API-Ressource senden möchten, die Sie aufrufen möchten, kann ich einen Blick von unserer Seite werfen.

+2

Ich verbrachte nur eine Stunde zu versuchen, herauszufinden, warum Ihr Dokument nicht funktioniert hat, und es war nicht Ihr Dokument Schuld, es war, dass ich nicht t Stellen Sie die API anschließend bereit. Können Sie darüber nachdenken, das in Ihr Dokument zu schreiben? http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors.html – turiyag

+1

Bloody hell thanks mate thanks! Ich war jetzt schon ein paar Stunden hier ... es stellte sich heraus, dass ich die API austricksen musste. Seltsam, dass ich das bei anderen Änderungen nicht machen musste! :/ – rex

+0

haha. Lustig - aber ich habe in letzter Zeit mehrmals geholfen, dieses Problem zu beheben. wir müssen immer noch daran denken, den Code zu implementieren :) –

Verwandte Themen