在工作中会经常使用的 curl 进行接口测试这里记录一下测试的命令.
在 windows & linux 系统下发送JSON数据时要注意(Windows 下):
"
要加 \
转义&
符号需要加 \
转义-H "Content-Type:application/json"
CR LF
;Mac中的换行符为 LF
;Linux 系统中的换行符为CR
# 修改前
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 |
HTTP POST方式传送数据 |
--data-ascii |
以ascii的方式post数据 |
--data-binary |
以二进制的方式post数据 |
--connect-timeout |
设置最大请求时间 |
测试脚本
#!/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 统一输出到标准输出中以方便调试
添加选项 -s
curl -s --url http://localhost:8080/sync
示例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"
示例5
cat >json.txt <<EOF
{
"name": "ghimi"
}
EOF
curl -v -s \
--url "http://localhost:8080/home" \
--data-binary "@json.txt" \
--header 'Content-Type: application/json' \
--header 'Accept: application/json'