我正在嘗試在 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}":""}}
請指導我。謝謝!
uj5u.com熱心網友回復:
嘗試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
uj5u.com熱心網友回復:
這里的curl命令存在一些問題,我更愿意以稍微不同的方式處理。
第一個問題是JSON的準備。
使用'{"DataArr":[{"serialno":'${sNo[i%5]}',"filePath":'$f'}]}',生成的 JSON 有問題。為價值觀serialno和filePath外觀可能字母數字或可包含空格,這意味著該值將需要用雙引號,例如"filePath": "/path/to/some where/to/new note",這是沒有處理。
我建議使用 JSON 準備 JSONjq并將其存盤在 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"
因此,結束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
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/314456.html
