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으로 인코딩하지 않으면 JSON 문서에 셸 변수를 삽입할 수 없습니다.
문자열을 인코딩하는 한 가지 방법은 다음을 사용하는 것입니다 jq
.
status_details=$( jq -n --arg string "$temp" '$string' )
위 명령은 쉘 변수가 아닌 $string
내부 변수라는 점에 유의하시기 바랍니다 . jq
이 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"' ...
)는 사용하지 않습니다.