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

如何发送含转义双引号的REST API请求并解决JSON格式报错

问题根因

你遇到的报错本质是手动拼接JSON时格式非法,服务端解析请求体失败后抛出了误导性的Content-Type错误,具体问题点有3个:

  • 变量名定义和引用不匹配:脚本开头定义的是data=mycontent,实际请求体里引用的是$mycontent,未定义的变量会被shell替换为空值,直接打乱JSON结构
  • 引号转义逻辑错误:shell单/双引号嵌套、JSON字符串内部转义的规则叠加,你写的拼接逻辑会生成引号不配对的非法JSON
  • 鉴权头写法不规范:-H 'Authorization: Bearer '"$SERVER_TOKEN"'' 多嵌套了一层空单引号,存在隐性兼容问题

正确实现方案

优先推荐用jq自动生成JSON,不需要手动处理任何转义规则,哪怕content内容里自带双引号、换行、特殊字符都不会出现格式错误:

# 先正确定义变量
mycontent="你的内容,哪怕本身带\"双引号\"也不会出错"

curl -X POST "$SERVER_ENDPOINT" \
  -H "Authorization: Bearer $SERVER_TOKEN" \
  -H "Content-Type: application/json" \
  --data "$(jq -n \
    --arg type "TYPE1" \
    --arg name "NAME1" \
    --arg content "\"$mycontent\"" \
    '$ARGS.named')" \
| jq

说明:如果不需要content字段值前后自带双引号,去掉--arg content行里$mycontent前后的\"即可。

如果你明确知道content内容不存在任何特殊字符,非要手动拼接JSON,可以用以下写法(不推荐生产环境用,内容带特殊字符会直接报错):

mycontent=mycontent

curl -X POST "$SERVER_ENDPOINT" \
  -H "Authorization: Bearer $SERVER_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"type\":\"TYPE1\",\"name\":\"NAME1\",\"content\":\"\\\"$mycontent\\\"\"}" \
| jq

额外说明

你看到的Content-type must be application/json报错不是因为你没写对请求头,是大部分Web框架的统一异常处理逻辑:只要请求体JSON解析失败,就会默认返回这个错误,和头本身无关。

内容的提问来源于stack exchange,提问作者Kintarō

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 07:24:24