如何在bash脚本中的curl主体中发送多行数据?

如何在bash脚本中的curl主体中发送多行数据?

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"

在实际脚本中,变量tempstdout.因此,它将是多行输出。如果我尝试上面的脚本,我会收到以下错误:

{"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"' ...) 括起来。

相关内容