Linux命令-curl

curl 是一个运行在命令行的 http 客户端。使用 curl 命令可以发起 http 请求并返回结果,基本功能类似于 postman 工具。

发送get请求

使用curl [URL]可以发送最简单的get请求。例如curl https://www.baidu.com

当然也可以发送带参数的get请求,发送带参数的get请求时,最好是对URL加上单引号('')或双引号("")。另外需要注意,如果参数中含有空格、中文等特殊字符的,需要先对中文字符进行urlcode编码。例如这个请求会失败:

1
curl "http://localhost:8081/test/addEmployee?employeeNum=12341234&employeeName=张三"

换成这样就可以成功调用接口:

1
curl "http://localhost:8081/test/addEmployee?employeeNum=12341234&employeeName=%E5%BC%A0%E4%B8%89"

显示通信过程与头信息

-v或者--verbose 参数可以显示一次 http 通信的整个过程,包括端口连接、请求头和响应头的信息。例如

1
curl -v www.baidu.com

发送post请求

curl命令默认是发送get请求的,如果要发送post请求,通过-X或者--request参数指定,例如

1
curl -X POST www.baidu.com

发送其它非get方式的Http请求,也是通过这个参数指定,比如-X PUT-X DELETE等等。

如果需要传form-data格式的参数,可以加上-d或者--data后加参数,例如

1
2
3
curl -X POST -d "employeeNum=12341234&employeeName=%E5%BC%A0%E4%B8%89" http://localhost:8081/test/addEmployee

curl -X POST --data "employeeNum=12341234&employeeName=%E5%BC%A0%E4%B8%89" http://localhost:8081/test/addEmployee

如果使用了-d参数,-X POST参数也可以省略不写,例如上面的例子也可以写成如下:

1
curl -d "employeeNum=12341234&employeeName=%E5%BC%A0%E4%B8%89" http://localhost:8081/test/addEmployee

如果post请求的参数是json格式,还需要通过-H或者--header参数在请求头中指定Content-Type: application/json,例如

1
curl --request POST --header "Content-Type: application/json" --data "{\"employeeNum\": \"010111\",\"employeeName\": \"Jack\"}" "http://localhost:8081/test/addEmployeeJson"

json数据也可以放在一个文件里,

1
curl --request POST --header "Content-Type: application/json" --data @test.json "http://localhost:8081/test/addEmployeeJson"

设置请求头参数

-H或者--header参数可以设置请求头,多个请求头要多次使用该参数,例如

1
2
3
4
5
6
curl --request POST "http://localhost:8081/http/test/testHttpRequest" \
--header "Content-Type: application/json" \
--header "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36" \
--header "Cookie: _ga=GA1.2.303411826.1562744042" \
--header "sign: ABC123ABC" \
--data @test.json

设置cookie

-H或者--header参数可以设置cookie,参考上面的例子。除此以外,设置cookie也可以用-b或者--cookie参数,例如

1
2
3
4
5
curl --request POST "http://localhost:8081/http/test/testHttpRequest" \
--header "Content-Type: application/json" \
--cookie "cookie_01=value1" \
--cookie "cookie_02=value2" \
--data @test.json

多个cookie也可以写在一起,比如上面的这个例子,可以写成:

1
--cookie "cookie_01=value1;cookie_02=value2" \

但是也需要注意,如果--header参数中设置了cookie,--cookie参数中设置的cookie会无效,比如

1
2
3
4
5
curl --request POST "http://localhost:8081/http/test/testHttpRequest" \
--header "Content-Type: application/json" \
--cookie "cookie_01=value1;cookie_02=value2" \
--header "Cookie: _ga=GA1.2.303411826.1562744042" \
--data @test.json

服务端最终只收到了_ga这个cookie,收不到cookie_01和cookie_02。

参数包含file格式

有的请求中参数是file格式,curl命令也可以通过-F或者--form参数实现,这个参数相当于设置浏览器表单属性(method="POST",enctype="multipart/form-data"),可以上传二进制文件,并且传输其它文本类参数。例如

1
2
3
4
curl --request POST "http://localhost:8081/http/test/testUpload" \
--form "file=@附件截图.png" \
--form "otherFile=@C:\Users\lenovo\Desktop\baidu.txt" \
--form "userid=12345"

--form中的value值如果也有中文,也需要做一下urlencode,否则服务端可能会有乱码问题。

下载文件

使用-O参数可以下载文件到当前目录,但这样下载下来的文件名称是url中最后的资源的名称,如果想保持源文件名称(即类似于浏览器下载下来的文件名),需要用-OJ或者-O -J参数。

1
curl "http://localhost:8081/http/test/testDownload" -OJ

------ 本文完 ------