curl
我正在尝试从脚本发送正文中的多行注释bash
。下面是我的curl
调用。
#!/bin/bash
temp="This is sample data: 2019/05/21 03:33:04
This is 2nd sample data: #2 Sample_Data"
response=$(curl -sS --location "${HEADERS[@]}" -w "%{http_code}\n" -X POST "$url" --header 'Content-Type: application/json' \
--data-raw "{
\"id\" : \"111\",
\"status\" : {
.
.
.
\"details\" : [ \"$temp\" ]
}
}")
echo "$response"
在实际脚本中,变量temp
是stdout
.因此,它将是多行输出。如果我尝试上面的脚本,我会收到以下错误:
{"exceptionClass":"xxx.exception.MessageNotReadableException","errorCode":"xxx.body.notReadable","message":"The given request body is not well formed"}400
谁能告诉我问题是什么以及如何解决它?
提前致谢
答案1
JSON 字符串不能包含文字换行符。如果没有首先对变量的值进行正确的 JSON 编码,则无法将 shell 变量注入到 JSON 文档中。
对字符串进行编码的一种方法是使用jq
:
status_details=$( jq -n --arg string "$temp" '$string' )
请注意,$string
上面的命令中是一个内部jq
变量,而不是 shell 变量。该jq
实用程序将对命令行上给出的值进行编码$string
,并将其输出为 JSON 编码字符串。
鉴于您的示例代码,这会将status_details
变量设置为以下文字字符串,包括引号:
"This is sample data: 2019/05/21 03:33:04\n This is 2nd sample data: #2 Sample_Data"
然后您可以在调用中使用它curl
:
curl -s -S -L -w '%{http_code}\n' -X POST \
--data-raw '{ "id": "111", "status": { "details": [ '"$status_details"' ] } }' \
"$url"
如果details
数组用于将每一行存储为$temp
单独的元素,您可以将其拆分$temp
为一个数组,如下jq
所示:
status_details=$( jq -n --arg string "$temp" '$string | split("\n")' )
这会给你以下的字面刺痛$status_details
:
[
"This is sample data: 2019/05/21 03:33:04",
" This is 2nd sample data: #2 Sample_Data"
]
curl
然后,您可以按照与上面所示几乎相同的方式使用它,但不用$status_details
方括号 ( ... "details": '"$status_details"' ...
) 括起来。