You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 03:09:03