![](/img/trans.png)
[英]How to send a post request with the result of a command or a script using curl?
[英]How to send nested object data as post data using curl command in shell script?
我正在嘗試在 shell 腳本中使用 curl 命令發送發布請求。
當我在終端中運行此 curl 命令時,它工作正常。
curl -d '{"DataArr":[{"serialno":"ab1","filePath":"/home/name/notes1"}]}' -H 'Content-Type: application/json' -H 'Authorization: tasfdgfdhh...' http://localhost:8081/create
同樣,我試圖將它作為 shell 腳本文件運行,它正在訪問服務器,但數據格式不是預期的。 數組括號轉換為 :" 或類似 :{ 。我嘗試了很多次不同的可能性,但我不明白如何准備正確的請求。以下是服務器端的代碼和響應。
我正在使用循環語句來模擬多個請求,
code:
#!/bin/bash
echo "hello welcome to testing";
token=asdghadjakalskl.....
requestNo=10
i=0
sNo=(ab1 ab2 ab3 ab4 ab5)
fn=(notes1 Pictures/crop.jpeg Pictures/cat.jpeg Pictures/mountain.jpg Pictures/magic.jpeg Pictures/tree.jpg)
echo $1
for (( i=0; i< $1;i++ ))
do
# echo "welcome inside the loop $s"
echo ${sNo[i%5]} ${fn[i%6]}
f="/home/name/${fn[i%6]}"
# echo $token
echo file $f
echo $i request sent
curl -d '{"DataArr":[{"serialno":'${sNo[i%5]}',"filePath":'$f'}]}' -H "'Content-Type: application/json'" -H 'Authorization: '$token'' http://localhost:8080/create
done
在服務器端,
{"{\"qualityDataArr\":":{"{\"serialNumberCustomer\":ab1,\"filePath\":/home/name/notes1}":""}}
請指導我。 謝謝!
試試echo """'{\\"DataArr\\":[{\\"serialno\\":\\"${sNo[i%5]}\\",\\"filePath\\":\\"$f\\"}]}'"""
如果顯示正常,則使用echo curl -d """'{\\"DataArr\\":[{\\"serialno\\":\\"${sNo[i%5]}\\",\\"filePath\\":\\"$f\\"}]}'""" -H "'Content-Type: application/json'" -H """'Authorization: $token'""" http://localhost:8080/create | bash
echo curl -d """'{\\"DataArr\\":[{\\"serialno\\":\\"${sNo[i%5]}\\",\\"filePath\\":\\"$f\\"}]}'""" -H "'Content-Type: application/json'" -H """'Authorization: $token'""" http://localhost:8080/create | bash
這里的curl
命令存在一些問題,我更願意采用稍微不同的方法。
第一個問題是JSON的准備。
使用'{"DataArr":[{"serialno":'${sNo[i%5]}',"filePath":'$f'}]}'
,生成的 JSON 有問題。 serialno
和filePath
的值看起來可能是字母數字或可能包含空格,這意味着這些值需要用雙引號引起來,例如"filePath": "/path/to/some where/to/new note"
,這不會被處理。
我建議使用jq
准備 JSON 並存儲在 shell 變量中,以便以后與curl -d
使用。 例子,
jq --null-input \
--arg serialno ${sNo[i%5]} \
--arg filePath $f \
'{"DataArr": [{"serialno": $serialno,"filePath": $filePath}]}'
--null-input
是因為我們想從頭開始構造 JSON 數據
--arg name value
允許我們將字符串值作為預定義變量傳遞給jq
。
例如,這將為您提供以下格式良好的 JSON:
{
"dataarr": [
{
"serialno": "ab1",
"filepath": "/home/name/notes1"
}
]
}
並且這個格式良好的 JSON 可以存儲在一個 shell 變量中供以后使用:
prepared_payload=$( jq --null-input \
--arg serialno ${sNo[i%5]} \
--arg filePath $f \
'{"DataArr": [{"serialno": $serialno,"filePath": $filePath}]}' )
現在我們可以使用這個prepared_payload
,比如curl -d "${prepared_payload}"
下一個問題是curl
標頭選項中單引號和雙引號的不當使用-H "'Content-Type: application/json'"
和-H 'Authorization: '$token''
有相關的過去問題/答案,有助於深入了解,
Bash 中單引號和雙引號的區別https://www.gnu.org/software/bash/manual/html_node/Single-Quotes.html https://www.gnu.org/software/bash/manual/html_node/Double -Quotes.html
首選方法是-H "Content-Type: application/json"
和-H "Authorization: $token"
因此, end curl
命令如下所示:
prepared_payload=$( jq --null-input \
--arg serialno ${sNo[i%5]} \
--arg filePath $f \
'{"DataArr": [{"serialno": $serialno,"filePath": $filePath}]}' )
curl -d "${prepared_payload}" -H "Content-Type: application/json" \
-H "Authorization: $token" \
http://localhost:8080/create
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.