如何修复Taskfile中本地Lambda测试的curl命令转义问题?
解决本地Lambda测试中Task工具+curl的JSON转义问题
我用public.ecr.aws/lambda/python:3.8镜像本地测试Lambda函数时,通过Task工具调用curl发送POST请求遇到了两难问题:如果对JSON payload做编码,API会报错无法解析;不编码的话,Task命令直接报YAML语法错误。
我的Taskfile.yml内容:
version: "3" tasks: default: desc: Test the API cmds: - curl -XPOST http://localhost:9000/2015-03-31/functions/function/invocations -d '{'name': 'Todd'}'
遇到的两个错误:
- Task命令报错:
yaml: line 7: did not find expected key
- API解析报错:
[test] {"errorMessage": "Unable to unmarshal input: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)", "errorType": "Runtime.UnmarshalError", "stackTrace": []}
错误原因
- YAML语法错误:原命令里用单引号嵌套单引号,YAML解析时会把
'{'name': 'Todd'}'拆成不完整的语法结构,直接触发解析失败。 - JSON格式错误:JSON规范要求属性名必须用双引号,原payload用的单引号,Lambda的JSON解析器自然无法识别。
解决方案
以下三种方法都能解决问题,按需选择:
方法一:转义双引号
用双引号包裹curl的-d参数,同时对内部的双引号做YAML转义(加\),既满足YAML语法,又输出符合规范的JSON:
version: "3" tasks: default: desc: Test the API cmds: - curl -XPOST http://localhost:9000/2015-03-31/functions/function/invocations -d "{\"name\": \"Todd\"}"
方法二:用YAML块标量
用|定义多行命令,直接写正常的curl命令,不用处理转义,可读性更高:
version: "3" tasks: default: desc: Test the API cmds: - | curl -XPOST http://localhost:9000/2015-03-31/functions/function/invocations -d '{"name": "Todd"}'
方法三:读取外部JSON文件
把payload单独存成JSON文件(比如payload.json),用curl的@参数读取,适合复杂payload的场景:
payload.json内容:
{"name": "Todd"}
修改后的Taskfile.yml:
version: "3" tasks: default: desc: Test the API cmds: - curl -XPOST http://localhost:9000/2015-03-31/functions/function/invocations -d @payload.json
内容的提问来源于stack exchange,提问作者tdensmore
相关产品推荐
相关产品推荐

