API 网关 Lambda 终端点代理与非代理集成

4

我构建了数百个API和Lambda,从未遇到过这样的讨论。

我总是使用代理集成,并在我的代码中解析参数,使用以下方法:

x = event['queryStringParameters']
ID   = x.get("param1")
name = x.get("param2")

然而,前端工程师认为我们应该遵循推荐的命名规则,并将参数作为路径参数传递给API,就像在此链接中一样:https://restfulapi.net/resource-naming/。经过一些研究,我发现这基本上是非代理集成,我应该在API GW中配置param。尽管我在许多博客中阅读到这不是推荐的方法,但我找不到明确偏爱代理集成的AWS文档。
代理(路径参数):http://api.example.com/device-management/managed-devices/{id} 非代理(查询字符串参数):http://api.example.com/device-management/managed-devices?param1={id} 我一直在试图说服他,我没有看到过这种用法,并且API URL在应用程序代码中使用,那么API URL的外观为什么要紧要!?请告诉我您的意见,谢谢。

你所指的代理集成是什么? 我能找到的大部分讨论都是关于Lambda的“API网关代理集成”。然而,你似乎在提到{proxy+}路径映射? - qkhanhpro
是的,我的意思是API网关代理集成。因为这样我就可以配置参数作为路径参数发送。 - Data_sniffer
2个回答

2
Lambda代理集成将请求直接从客户端发送到Lambda函数,不进行任何修改。它直接将一个URL映射到一个Lambda函数。因此,不能在此设置中使用路径参数。更新: 可以使用URL中的{path}段来使用路径参数,如AWS文档所述。
Lambda集成可以在发送请求到Lambda函数之前修改请求,还可以在从同一函数发送响应到客户端之前修改响应。使用Lambda集成,API设计人员可以更好地控制API,而不是将API定义嵌入到代码中。可以轻松从API网关Velocity模板语言(VTL)生成swagger API规范。
Lambda代理集成适用于快速原型设计,但Lambda集成适用于成熟的REST API。

感谢您的积极回应。这是您的个人意见还是 AWS 的建议?如果是后者,能否请您与我分享文档链接? - Data_sniffer
1
嗨@Data_sniffer,抱歉。我指的是旧的Lamda代理集成。现在你可以使用路径参数与代理集成。没有必要仅为了路径参数而选择非代理集成。 - Nidin Vinayakan

0

这里有两个不同的问题。1:什么是指定资源的适当REST方式,2:如何将路径变量从API网关传递到Lambda函数。

对于问题#1,我会支持您的前端开发人员。 RESTful资源通过URI(翻译:使用路径变量)指定。 不使用查询参数来识别资源。 有很多关于REST设计的文章,可以追溯到近20年,这可能解释了您的前端开发人员的任何顽固性。 我不希望AWS文档在此发表意见,尽管API网关的整个设计都是以RESTful URIs为基础建立的。 当URI是设计的显式部分时,Swagger导入/导出要更有用。 供参考,请查看宠物店样例API(即GET / pets / {id},而不是GET / pets?id = x)。

对于问题#2,您可以使用代理或非代理集成来访问该路径变量。 对于代理集成,您的Lambda代码可以使用"pathParameters"(在宠物店的情况下为pathParameters.id)访问路径变量。 我不确定在您最初发布问题时是否可用“pathParameters”键,这可能导致您得出结论,更费力的非代理集成是实现此目的的唯一方法。 参考:https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-input-format


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接