如何解决Windows环境Github Actions发POST请求至Sentry的JSON错误
修复Windows PowerShell中Sentry通知请求的JSON格式错误
问题场景
在GitHub Actions的windows-latest环境中,执行PowerShell脚本向Sentry发送新版本通知,脚本构造的JSON在控制台输出看似正确,但服务器始终返回错误:Expecting property name enclosed in double quotes。原脚本如下:
- name: Notify Sentry run: | $VERSION_NAME = "${{ github.ref_name }}" $REQUEST = "{`\"version`\": `\"$VERSION_NAME`\"}" echo $REQUEST curl -X POST -H "Content-Type:application/json" -d "$REQUEST" "https://sentry.io/api/hooks/release/builtin/...id.../...token.../"
执行日志显示输出的JSON为{"version": "v1.1.1"},但请求仍失败。
问题根源
在Windows PowerShell中,curl是Invoke-WebRequest的别名,并非原生的curl工具。当使用这个别名传递-d参数时,PowerShell会对JSON字符串进行额外的解析和转义处理,导致实际发送到服务器的JSON格式被破坏——虽然控制台输出的JSON看起来正常,但传递给服务端的内容已经出现格式错误。
修复方案
方案1:使用PowerShell原生Invoke-RestMethod(推荐)
PowerShell的Invoke-RestMethod专门用于处理HTTP请求,能自动正确处理JSON格式,避免手动构造字符串的转义问题:
- name: Notify Sentry run: | $VERSION_NAME = "${{ github.ref_name }}" # 用哈希表构造数据,再转成标准JSON $requestBody = @{ version = $VERSION_NAME } | ConvertTo-Json Invoke-RestMethod -Method Post ` -Uri "https://sentry.io/api/hooks/release/builtin/...id.../...token.../" ` -Body $requestBody ` -ContentType "application/json" shell: pwsh
方案2:调用原生curl工具
如果坚持使用curl命令,需要指定GitHub Actions环境中git自带的原生curl完整路径,避免触发PowerShell的别名:
- name: Notify Sentry run: | $VERSION_NAME = "${{ github.ref_name }}" $REQUEST = "{`"version`": `"$VERSION_NAME`"}" echo $REQUEST # 调用Git自带的原生curl & "C:\Program Files\Git\mingw64\bin\curl.exe" -X POST ` -H "Content-Type:application/json" ` -d "$REQUEST" ` "https://sentry.io/api/hooks/release/builtin/...id.../...token.../" shell: pwsh
内容的提问来源于stack exchange,提问作者BArtWell
相关产品推荐
相关产品推荐

