如何发送含转义双引号的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ō
相关产品推荐
相关产品推荐

