curl 使用笔记

在工作中会经常使用的 curl 进行接口测试这里记录一下测试的命令.
在 windows & linux 系统下发送JSON数据时要注意(Windows 下):

  • 单引号要改成双引号
  • JSON字符串中的双引号"要加 \ 转义
  • & 符号需要加 \ 转义
  • JSON 字符串请求加-H "Content-Type:application/json"
  • windows 系统中的换行符为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 统一输出到标准输出中以方便调试

% 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"

示例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'

你可能感兴趣的:(工具)