簡體   English   中英

如何在shell腳本中使用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 有問題。 serialnofilePath的值看起來可能是字母數字或可能包含空格,這意味着這些值需要用雙引號引起來,例如"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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM