2016-03-03 3 views
8

zu verwenden Ich versuche, den gesamten Datenverkehr für eine Domäne zu einem anderen umzuleiten. Anstatt einen Server speziell für diesen Job auszuführen, habe ich versucht, AWS API Gateway mit Lambda zu verwenden, um die Umleitung durchzuführen.Ist es möglich, Wildcards oder Catch-All-Pfade in AWS API Gateway

Ich habe dies funktioniert ok für den Stammpfad "/", aber alle Anfragen für Teilpfade, z./a werden nicht behandelt. Gibt es eine Möglichkeit, eine "catch all" -Ressource oder einen Wildcard-Pfad-Handler zu definieren?

Antwort

11

Wie in der vergangenen Woche, API-Gateway unterstützt jetzt, was sie „Catch-all Pfadvariablen“ nennen.

Alle Details und ein Freilos hier: API Gateway Update – New Features Simplify API Development

+0

Wenn Sie immer noch auf der Suche nach dieser Antwort in 2018, schaut euch bitte @ geekQs Antwort an (https://stackoverflow.com/a/40608247/347777), da nun ein echter Catch-All (der zu/a/b/c/d/... passt) möglich ist. – Viccari

1

Sie können eine Ressource mit der Pfadvariablen /{param} erstellen und dies als Platzhalter für Platzhalter behandeln.

Danke, - Ka Hou

+0

Dank, wissen Sie, ob diese mit verschachtelten Pfaden funktionieren würde? Wenn ich/{param} verwende, würde das mit/a übereinstimmen, aber ich bin mir nicht sicher, ob es mit/a/b/c übereinstimmt. Da ich versuche, den gesamten Datenverkehr umzuleiten, würde ich es am liebsten mögen,/* oder Ähnliches sagen zu können. –

+1

Definieren einer Ressource für '/ {param}' wird nicht verschachtelte Pfade behandeln. Zum Beispiel '/ something' wird übereinstimmen, aber'/something/else' stimmt nicht mit der Ressource '/ {param}' –

+1

Das stimmt. API Gateway unterstützt derzeit nicht mehrere Ebenenpfade. –

8

Update: Wie in der vergangenen Woche, jetzt API-Gateway unterstützt, was sie „Catch-all Pfadvariablen“ nennen. Siehe API Gateway Update – New Features Simplify API Development.


Sie müssen leider eine Ressource für jede Ebene erstellen. Der Grund hierfür ist, dass Sie mit API Gateway über ein Objekt auf diese Parameter zugreifen können.

Zum Beispiel: method.request.path.XXXX

Also, wenn Sie haben gerade /{param} Sie, dass mit zugreifen können: method.request.path.param aber wenn Sie einen verschachtelten Pfad (params mit Schrägstrichen) haben, würde es nicht funktionieren. Sie erhalten auch einen 404 für die gesamte Anfrage.

Wenn ein Array statt ... wäre, dann könnte es params nach Position, wenn nicht benannt. Zum Beispiel method.request.path.param[] ... Named Params könnte sogar unter dort gehandhabt werden, aber auf sie zuzugreifen wäre nicht wirklich einfach. Es müsste etwas JSON-Pfad-Mapping verwendet werden (denken Sie daran, was Sie mit ihren Mapping-Templates machen können). Leider wird dies nicht in API Gateway gehandhabt.

Ich denke, es ist in Ordnung, obwohl dies die Konfiguration von API Gateway noch komplexer machen könnte. Es beschränkt jedoch auch das API-Gateway und um mit dieser Situation fertig zu werden, wird es letztendlich zu einer verwirrenderen Konfiguration kommen.

So können Sie den langen Weg hier gehen. Erstellen Sie die gleiche Methode für mehrere Ressourcen und tun Sie etwas wie: /{1}/{2}/{3}/{4}/{5}/{6}/{7} und so weiter. Dann können Sie bei Bedarf jede Pfadparameterebene behandeln.

Wenn die Anzahl der Parameter immer gleich ist, dann sind Sie ein bisschen glücklicher und müssen nur eine Reihe von Ressourcen einrichten, aber eine Methode am Ende.

Quelle: https://forums.aws.amazon.com/thread.jspa?messageID=689700&#689700

+1

Ab der letzten Woche unterstützt das API-Gateway nun sogenannte "Catch-all Path-Variablen": https://aws.amazon.com/blogs/aws/api-gateway-update-new-features-simplify-api-development/ –

+1

Sie können jetzt auch 'ANY' Anfrage und'/{Proxy +} '- so viel mehr als nur einen Platzhalterpfad, aber eine Wildcard-HTTP-Methode wird auch unterstützt \ o/ – Tom

2

Sie können eine Ressource mit Pfad wie /{thepath+} erstellen. Pluszeichen ist wichtig.

Dann in Ihrer Lambda-Funktion können Sie den Wert mit beiden

Zugriff
  • event.path - enthält immer den vollständigen Pfad
  • oder event.queryPathParameters.thepath - enthält die von Ihnen definierten Teil. Andere mögliche Anwendungsfälle: Definieren Sie Ressourcen wie /images/{imagepath+}, um nur Pfade mit bestimmten Präfixen zu vergleichen. Die Variable enthält nur den Unterpfad.

Sie können alle an Ihre Funktion übergebenen Werte debuggen mit: JSON.stringify(event)

Full documentation