在工作中會經常使用的 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"