zsh中curl从文件读取payload发POST返回400,手动输入则请求成功
问题根因
核心问题是Shell变量未被正确展开:你在--data-raw参数中使用单引号包裹JSON字符串,而Shell规则中单引号会禁用内部所有特殊字符的解析,$LineFromFile不会被替换为读取到的实际ID值,而是直接作为字面量"$LineFromFile"传到后端。后端尝试将这个不符合UUID格式的字符串转为UUID实例时失败,因此返回400错误。
修复方案
你可以选择以下任意一种方式修改代码:
方案1:替换JSON外层引号为双引号
将包裹JSON的单引号改为双引号,内部JSON原本的双引号做转义处理,即可正常解析变量:
while read -r LineFromFile; do curl --request POST '<url>' --header 'Content-Type: application/json' \ --data-raw "{ \"id\": \"$LineFromFile\", \"otherValue\": \"also_hardcoded\" }" done < "$1"
方案2:字符串拼接
将变量部分拆分到单引号外进行拼接,无需修改内部JSON的引号格式:
while read -r LineFromFile; do curl --request POST '<url>' --header 'Content-Type: application/json' \ --data-raw '{ "id": "'"$LineFromFile"'", "otherValue": "also_hardcoded" }' done < "$1"
方案3:用jq生成标准JSON(更稳妥)
如果ID中可能存在双引号、反斜杠等特殊字符,建议用jq工具生成合法JSON,避免出现格式错误:
while read -r LineFromFile; do payload=$(jq -n --arg id "$LineFromFile" '{"id": $id, "otherValue": "also_hardcoded"}') curl --request POST '<url>' --header 'Content-Type: application/json' --data-raw "$payload" done < "$1"
验证建议
修改代码后你可以给curl添加-v参数,打印实际发出的请求体,确认ID已经被正确替换为文件中读取的数值,即可快速验证配置是否生效。
内容的提问来源于stack exchange,提问作者valentinocc
相关产品推荐
相关产品推荐

