AWS Step Functions调用API Gateway时URL特殊字符转义及查询参数传递问题
AWS Step Functions调用API Gateway时URL特殊字符转义及查询参数传递问题
我之前也踩过这个坑!Step Functions的API Gateway调用任务对路径和查询参数的处理有严格规则,直接在Path字段里加?a=1肯定会被自动URL转义成path%3Fa%3D1,API Gateway会把这整个字符串当成路径的一部分,自然会报错。下面给你两种场景的解决方案:
场景1:查询参数是固定值
如果你的查询参数是固定的,直接用Step Functions提供的QueryParameters字段就行,注意它要求每个参数对应一个值数组(哪怕只有一个值也要用数组格式),比如:
{ "Type": "Task", "Resource": "arn:aws:states:::apigateway:invoke", "Parameters": { "ApiEndpoint": "endpoint", "AuthType": "IAM_ROLE", "Headers": { "Content-Type": ["application/json"] }, "Method": "GET", "Path": "path", "QueryParameters": { "a": ["1"] } }, "End": true }
这样Step Functions会自动把查询参数拼到请求URL后面,不会出现转义问题。
场景2:查询参数来自输入的键值对字符串
如果你是从Step Functions的输入里拿到类似a=1这样的字符串,需要先把它拆成键和值,再构造QueryParameters的格式。可以用Step Functions的内置Split函数来处理,比如假设你的输入是{"queryParamStr": "a=1"},可以这么写:
{ "Type": "Task", "Resource": "arn:aws:states:::apigateway:invoke", "Parameters": { "ApiEndpoint": "endpoint", "AuthType": "IAM_ROLE", "Headers": { "Content-Type": ["application/json"] }, "Method": "GET", "Path": "path", "QueryParameters.$": "{ \"${Split($.queryParamStr, '=')[0]}\": [\"${Split($.queryParamStr, '=')[1]}\"] }" }, "End": true }
这里用Split($.queryParamStr, '=')把字符串按=拆分成数组,第一个元素是参数名,第二个是参数值,再通过字符串插值构造出符合要求的QueryParameters结构。
重要提醒
千万不要把查询参数放在Path字段里!Step Functions会自动对Path中的特殊字符(比如?、=)进行URL编码,导致API Gateway无法识别这些是查询参数,只会把转义后的字符串当成路径的一部分,必然触发错误。
备注:内容来源于stack exchange,提问作者Ali Hasan
相关产品推荐
相关产品推荐

