curl 使用筆記

在工作中會經常使用的 curl 進行接口測試這裏記錄一下測試的命令.
在 windows & linux 系統下發送JSON數據時要注意(Windows 下):

  • 單引號要改成雙引號
  • JSON字符串中的雙引號"要加 \ 轉義
  • & 符號需要加 \ 轉義
  • JSON 字符串請求加-H "Content-Type:application/json"

# 修改前
curl --url "http://localhost:8080/sync?&account=abc"
# 修改後:
curl --url "http://localhost:8080/sync?\&account=abc"

# 修改前
curl -l -H "Content-Type:application/json" -H "Accept:application/json" -X POST -d '{"status":"STARTED"}' http://localhost:8080/sync
# 修改後
curl -l -H "Content-Type:application/json" -H "Accept:application/json" -X POST -d "{\"status\":\"STARTED\"}" http://localhost:8080/sync

注意在 bash 中,如果請求的 json字符串是用單引號括起來的話,字符串中的雙引號不需要進行轉義,但如果請求的 json 字符串是用雙引號括起來的話,字符串中的雙引號就需要轉義了.

幾個感覺比較有用的選項:

-v, --verbose       Make the operation more talkative
-X, --request COMMAND  Specify request command to use
     --resolve HOST:PORT:ADDRESS  Force resolve of HOST:PORT to ADDRESS
-H   --header LINE   Pass custom header LINE to server (H)
-d   --data DATA     HTTP POST data (H)
     --data-raw DATA  HTTP POST data, '@' allowed (H)
     --data-ascii DATA  HTTP POST ASCII data (H)
     --data-binary DATA  HTTP POST binary data (H)
     --data-urlencode DATA  HTTP POST data url encoded (H)
     --delegation STRING  GSS-API delegation permission
     --digest        Use HTTP Digest Authentication (H)
 -I, --head          Show document info only
 -O, --remote-name   Write output to a file named as the remote file
     --remote-name-all  Use the remote file name for all URLs
 -o, --output FILE   Write to FILE instead of stdout
 -L, --location      Follow redirects (H)

使用@符號可以從文件中讀取數據作爲參數.如下:

echo '{
	"syncheader": {
		"servertimesync": "2013112"
	}
}' >json.txt
curl localhost:9000/sync -H "Content-type:application/json" -X POST --data @json.txt
curl localhost:9000/sync -H "Content-type:application/json" -X POST --data-binary @json.txt

-D選項的說明

在輸入數據爲json格式的時候直接使用-D選項傳參 curl 會默認對數據進行壓縮後傳遞,但如果將--data選項修改爲 --data-binary時,便可以完整的將文本的內容進行傳輸了

選項 功能
--basic 使用HTTP基本驗證
-B/--use-ascii 使用ASCII文本傳輸
-d/--data <data> HTTP POST方式傳送數據
--data-ascii <data> 以ascii的方式post數據
--data-binary <data> 以二進制的方式post數據
--connect-timeout <seconds> 設置最大請求時間

測試腳本

#!/bin/bash
cat > json.txt <<EOF
{
	"name": "ghimi"
}
EOF
#echo '{
#	"name": "ghimi"
#}' >json.txt
 wc -c json.txt
# --data 選項請求的數據長度與文件長度不一致,有可能是 curl 命令對請求內容進行了壓縮,在某些情況下可能會導致異常
curl -v -H "Content-Type:application/json" --url "http://www.baidu.com" --request POST --data "@json.txt" -s 2>&1 | grep "> Content-Length:" | xargs echo "length used by option \"--data\":"
# --data-binary 選項請求時發送的數據長度是和文件的數據長度(wc -c json.txt)得到的結果是一致的
curl -v -H "Content-Type:application/json" --url "http://www.baidu.com" --request POST --data-binary "@json.txt" -s 2>&1 | grep "> Content-Length:" | xargs echo "length used by option \"--data-binary\":"
# --data 選項請求的數據長度與文件長度不一致,有可能是 curl 命令對請求內容進行了壓縮,在某些情況下可能會導致異常
curl -v -H "Content-Type:application/json" --url "http://www.baidu.com" --request POST --data-ascii "@json.txt" -s 2>&1 | grep "> Content-Length:" | xargs echo "length used by option \"--data-ascii\":"
# --data-raw 選項不會從文件中讀取數據,而是直接將 '@json.txt' 字符串作爲數據輸入,所以長度爲9
curl -v -H "Content-Type:application/json" --url "http://www.baidu.com" --request POST --data-raw "@json.txt" -s 2>&1 | grep "> Content-Length:" | xargs echo "length used by option \"--data-raw\":"
# curl 的追蹤信息會輸出到錯誤輸出2中需要使用 2>&1 統一輸出到標準輸出中以方便調試

% Total % Received % 統計信息的關閉方式

添加選項 -s

curl -s --url http://localhost:8080/sync

bash 下發送 post 請求腳本示例:

示例1:

#!/bin/bash
HOST="http://localhost:8080"
API="/syncApi"
DATA=\
'
{
	"name": "ghimi",
}
'
curl -v --url "$HOST$API" --data-raw "$DATA" -s  -H "Content-Type:application/json"

示例2:

#!/bin/bash
HOST="http://localhost:8080"
API="/syncApi"
echo \
'
{
	"name": "ghimi",
}
'>json.txt
curl -v --url "$HOST$API" --data-binary "@json.txt" -s  -H "Content-Type:application/json"

示例3:

#!/bin/bash
HOST="http://localhost:8080"
API="/syncApi"
cat >json.txt <<EOF
{
	"name": "ghimi",
}
EOF
curl -v --url "$HOST$API" --data-binary "@json.txt" -s  -H "Content-Type:application/json"

示例4

#!/bin/bash
URL="http://localhost:8080/syncApi"
DATA=\
'
{
	"name": "ghimi",
}
'
curl -v --url $URL --data-raw "$DATA" -s  -H "Content-Type:application/json"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章