如何通过Curl触发带JSON格式字符串输入的GitHub Action工作流
我在GitHub Actions中配置了一个以workflow_dispatch为触发事件的工作流,要求接收JSON格式的字符串输入,对应的YAML配置如下:
name: Json parse test on: workflow_dispatch: inputs: parameters_json: type: string required: true jobs: build_and_deploy: name: Json parse test runs-on: ubuntu-latest steps: - name: Parse json input id: json run: | echo ${{ fromJson(github.event.inputs.parameters_json).targetPlatform }}
我希望通过Curl请求触发该工作流,网页手动触发正常,但执行以下Curl命令时出现JSON解析错误:
curl -X POST -H "Accept: application/vnd.github+json" -H "Authorization: Bearer
" -H "X-GitHub-Api-Version: 2022-11-28" https://api.github.com/repos/ / /actions/workflows/json_parse_test.yml/dispatches -d '{"ref":"dev","inputs":{"parameters_json":"{"targetPlatform":"asd","param":45}"}}'
错误信息:
{ "message": "Problems parsing JSON", "documentation_url": "https://docs.github.com/rest/reference/actions#create-a-workflow-dispatch-event" }
传递普通字符串输入时工作流可正常触发,说明Curl命令本身无问题,请问该如何发送JSON格式的字符串输入解决这个解析问题?
问题出在嵌套JSON字符串的引号冲突:你在-d参数里用单引号包裹整个JSON,但内部parameters_json的值又是一个用双引号包裹的JSON,这会导致JSON结构被提前截断,GitHub API无法正确解析。
有两种可行的解决方式:
方式1:转义内部JSON的双引号
把内部JSON字符串里的双引号用反斜杠转义,确保整个JSON结构的完整性:
curl -X POST -H "Accept: application/vnd.github+json" -H "Authorization: Bearer <my token>" -H "X-GitHub-Api-Version: 2022-11-28" https://api.github.com/repos/<owner>/<my repo>/actions/workflows/json_parse_test.yml/dispatches -d '{"ref":"dev","inputs":{"parameters_json":"{\"targetPlatform\":\"asd\",\"param\":45}"}}'
方式2:将JSON内容写入文件,通过文件传递
如果嵌套的JSON结构复杂,转义容易出错,可以把完整的请求体写入一个文件(比如payload.json):
{ "ref": "dev", "inputs": { "parameters_json": "{\"targetPlatform\":\"asd\",\"param\":45}" } }
然后用Curl的@参数读取文件发送:
curl -X POST -H "Accept: application/vnd.github+json" -H "Authorization: Bearer <my token>" -H "X-GitHub-Api-Version: 2022-11-28" https://api.github.com/repos/<owner>/<my repo>/actions/workflows/json_parse_test.yml/dispatches -d @payload.json
注意:不管用哪种方式,parameters_json的值本身是一个字符串形式的JSON,所以必须用双引号包裹,内部的双引号要转义,这样GitHub Actions才能用fromJson正确解析。
内容的提问来源于stack exchange,提问作者Miguel

