【问题标题】:Is it possible to use wildcards or catch-all paths in AWS API Gateway是否可以在 AWS API Gateway 中使用通配符或包罗万象的路径
【发布时间】:2020-03-25 06:18:27
【问题描述】:

我正在尝试将一个域的所有流量重定向到另一个域。我没有专门为这项工作运行服务器,而是尝试使用带有 lambda 的 AWS API Gateway 来执行重定向。

我的根路径“/”可以正常工作,但是对子路径的任何请求,例如/a 不处理。有没有办法定义“包罗万象”的资源或通配符路径处理程序?

【问题讨论】:

    标签: aws-api-gateway


    【解决方案1】:

    从上周开始,API Gateway 现在支持他们所谓的“Catch-all Path Variables”。

    这里有完整的细节和演练:API Gateway Update – New Features Simplify API Development

    【讨论】:

    【解决方案2】:

    您可以使用/{thepath+} 之类的路径创建资源。加号很重要。

    然后在您的 lambda 函数中,您可以同时访问该值

    • event.path - 始终包含完整路径
    • event.pathParameters.thepath - 包含您定义的部分。其他可能的用例:定义 /images/{imagepath+} 之类的资源以仅匹配具有特定前缀的路径。该变量将仅包含子路径。

    您可以调试所有传递给您的函数的值:JSON.stringify(event)

    Full documentation

    【讨论】:

    • 这对我不起作用 - 尝试更新资源时,我收到 Resource's path part only allow a-zA-Z0-9._- and curly braces at the beginning and the end.
    • 这似乎也与基本 URL / 不匹配。
    • 如果你想匹配一个没有通配符参数的路径,你需要为它们定义一个单独的处理程序(在上面的例子中,为//images
    • 顺便说一句:似乎serverless-offlineevent.resource 中的+ 更改为*,即它变成/{thepath*} 而不是/{thepath+}(YML 文件语法)。因此,如果您有一些依赖于 event.resource 的 JS 级逻辑,则需要对其进行规范化,以使逻辑以与无服务器离线和真实 AWS 相同的方式工作。
    【解决方案3】:

    更新:从上周开始,API Gateway 现在支持他们所谓的“Catch-all Path Variables”。见API Gateway Update – New Features Simplify API Development


    不幸的是,您需要为每个级别创建一个资源。这样做的原因是 API Gateway 允许您通过对象访问这些参数。

    例如:method.request.path.XXXX

    因此,如果您只使用/{param},则可以使用:method.request.path.param 访问它,但如果您有嵌套路径(带有斜杠的参数),它将无法正常工作。您还将获得整个请求的 404。

    如果method.request.path.param 是一个数组,那么它可以在未命名时按位置获取参数。例如method.request.path.param[] ...命名参数甚至可以在那里处理,但访问它们并不容易。它需要使用某种 JSON 路径映射(想想你可以用他们的映射模板做什么)。遗憾的是,这不是 API Gateway 中的处理方式。

    我认为这没关系,因为这可能会使配置 API 网关变得更加复杂。但是,它也确实限制了 API 网关,并且要处理这种情况,您最终会得到一个更加混乱的配置。

    所以,你可以在这里走很长的路。为多个资源创建相同的方法并执行以下操作:/{1}/{2}/{3}/{4}/{5}/{6}/{7} 等等。然后,如果需要,您可以处理每个路径参数级别。

    如果参数个数总是一样,那你就比较幸运了,只需要设置一堆资源,但最后一个方法。

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

    【讨论】:

    • 从上周开始,API Gateway 现在支持他们所谓的“Catch-all Path Variables”:aws.amazon.com/blogs/aws/…
    • 您现在还可以使用 ANY 请求和 /{proxy+} - 不仅仅是通配符路径,还支持通配符 HTTP 方法 \o/
    【解决方案4】:

    与 AWS 最近引入的 HTTPAPI 相关,$default 用作通配符,用于捕获与定义的模式不匹配的所有路由。

    更多详情请参考:aws blogs

    【讨论】:

    【解决方案5】:

    您可以使用路径变量/{param} 创建资源,并且可以将其视为通配符路径处理程序。

    谢谢, - 家侯

    【讨论】:

    • 谢谢,您知道这是否适用于嵌套路径吗?即如果我使用 /{param} 这将匹配 /a 但我不确定它是否会匹配 /a/b/c?由于我正在尝试重定向所有流量,因此理想情况下我希望能够说 /* 或等效项。
    • /{param} 定义资源将不会处理嵌套路径。例如。 /something 将匹配,但 /something/else 将不匹配资源 /{param}
    • 没错。 API Gateway 目前不支持多级路径。
    • @DavidGoate 可以使用贪心模式{param+}匹配所有子资源
    猜你喜欢
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 2014-01-16
    • 2012-04-13
    • 1970-01-01
    相关资源
    最近更新 更多