将 /path/{proxy+} 与 AWS SAM 结合使用可在 API Gateway 中提供贪婪 API

mea*_*bia 6 go aws-lambda go-gin aws-api-gateway aws-sam

我正在使用 SAM。以下设置有效:

  Function:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: ./code/
      Runtime: go1.x
      MemorySize: 64
      Handler: main
      Events:
        TesstApi:
          Type: Api
          Properties:
            Path: /{proxy+}
            Method: any
Run Code Online (Sandbox Code Playgroud)

现在我有一个主要方法(在​​go中)

它看起来像这样:

package main

import (
    "context"
    "log"

    "github.com/aws/aws-lambda-go/events"
    "github.com/aws/aws-lambda-go/lambda"
    ginadapter "github.com/awslabs/aws-lambda-go-api-proxy/gin"
    "github.com/gin-gonic/gin"
)

var ginLambda *ginadapter.GinLambda

func Handler(ctx context.Context, req events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
    if ginLambda == nil {
        // stdout and stderr are sent to AWS CloudWatch Logs
        log.Printf("Gin cold start")
        r := gin.Default()
        r.GET("/", Index)
        r.GET("/test/hello", xxx)
        r.GET("/test/hi", xxx)

        ginLambda = ginadapter.New(r)
    }

    return ginLambda.ProxyWithContext(ctx, req)
}

func main() {
    lambda.Start(Handler)
}
Run Code Online (Sandbox Code Playgroud)

这很好用。这样我就可以使用 SAM 启动本地 api 网关并且curl 127.0.0.1:3000/test/hello运行良好

现在我尝试更新模板中的以下句子:

  Properties:
    Path: /{proxy+}
    Method: any
Run Code Online (Sandbox Code Playgroud)

  Properties:
    Path: /test/{proxy+}
    Method: any
Run Code Online (Sandbox Code Playgroud)

我想抓住这test条路之后的一切。

我尝试了以下方法:

    r.GET("/hello", xxx)
    r.GET("hello", xxx)
    r.GET("/test/hello", xxx)
Run Code Online (Sandbox Code Playgroud)

但它们都不起作用。

我想做的事情可能吗?如果是,如何?

小智 0

这不起作用的原因是 gin 接收来自 API Gateway 的路径RawPath,在您的实例中该路径将包含“/test”。所以你的第一个路由器将处理请求:

 r := gin.Default()
  r.GET("/", Index)
  r.GET("/test/hello", xxx)
  r.GET("/test/hi", xxx)
Run Code Online (Sandbox Code Playgroud)

很好奇您是否找到了解决方案,我自己也遇到了这个问题