与AWS SAM一起使用/path/{proxy+}在API网关中拥有贪婪的API



我正在使用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

现在我有一个主要的方法(在去(

它看起来像这样:

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)
}

这很好用。所以我可以用SAM启动我的本地api网关,curl 127.0.0.1:3000/test/hello在上运行良好

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

Properties:
Path: /{proxy+}
Method: any

Properties:
Path: /test/{proxy+}
Method: any

我想捕捉test路径之后的所有内容。

我尝试了以下方法:

r.GET("/hello", xxx)
r.GET("hello", xxx)
r.GET("/test/hello", xxx)

但它们都不起作用。

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

这不起作用的原因是gin从API网关RawPath接收路径,在您的实例中/测试";。所以你的第一个路由器会处理请求:

r := gin.Default()
r.GET("/", Index)
r.GET("/test/hello", xxx)
r.GET("/test/hi", xxx)

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

最新更新