curl是一款功能强大的命令行服务器请求工具,不仅支持多种协议,例如HTTP,HTTPS,FTP,SCP等等,还提供很多功能,例如用户认证,cookie管理,文件续传等等。这一篇文章我们一起来学习下如何用curl来测试后端开发的网页或者API。
我是T型人小付,一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关注我,如果有问题欢迎在底下的评论区交流,谢谢。
基本使用
直接在命令后面接url即可进行基本访问
curl url
这里需要注意url必须要完整,写清楚协议,例如
curl https://www.google.com
如果成功请求到一个网页,则会返回该网页对应的H5字符串。
我在后端创建一个测试页面test_page.html
如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Test Page</title>
</head>
<body>
<h2>This is a page to test curl usage</h2>
</body>
</html>
此时直接去访问该网页对应的url,结果如下
[fuhx@testmachine ~]$ curl http://127.0.0.1:8000/app/test_page/
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Test Page</title>
</head>
<body>
<h2>This is a page to test curl usage</h2>
</body>
</html>
H5页面被原封不动返回。
保存结果
当然,通常要查看网页直接用浏览器会更方便一点。使用命令行通常是为了将结果保存下来为后面使用。此时可以利用-o
进行输出重定向
[fuhx@testmachine ~]$ curl http://127.0.0.1:8000/app/test_page/ -o test_page.html
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 169 100 169 0 0 84500 0 --:--:-- --:--:-- --:--:-- 84500
[fuhx@testmachine ~]$ cat test_page.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Test Page</title>
</head>
<body>
<h2>This is a page to test curl usage</h2>
</body>
</html>
这里有个小技巧,如果请求的对象是一个文件,就可以达到跟wget
命令同样的下载效果。
查看头信息
如果要连同头信息一起返回,可以加上-i
参数
[fuhx@testmachine ~]$ curl -i http://127.0.0.1:8000/app/test_page/
HTTP/1.1 200 OK
Date: Fri, 17 Apr 2020 05:37:44 GMT
Server: WSGIServer/0.2 CPython/3.7.1
Content-Type: text/html; charset=utf-8
X-Frame-Options: SAMEORIGIN
Content-Length: 169
Vary: Cookie
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Test Page</title>
</head>
<body>
<h2>This is a page to test curl usage</h2>
</body>
</html>
可以看到这里将头部信息也显示了出来,如果想只显示头部信息可以将-i
换成-I
。通过状态码以及内容长度等等信息可以做访问异常一些基本的判断。
例如另一个网页就没有返回任何结果
[fuhx@testmachine ~]$ curl http://127.0.0.1:8000/app/test_redirect/
[fuhx@testmachine ~]$
查看头信息发现状态码是302,才知道被重定向了
[fuhx@testmachine ~]$ curl -I http://127.0.0.1:8000/app/test_redirect/
HTTP/1.1 302 Found
Date: Fri, 17 Apr 2020 05:43:45 GMT
Server: WSGIServer/0.2 CPython/3.7.1
Content-Type: text/html; charset=utf-8
Location: /app/test_page/
X-Frame-Options: SAMEORIGIN
Content-Length: 0
Vary: Cookie
下面看看怎么处理重定向问题。
页面跳转
利用-L
参数跟踪跳转到最终页面
[fuhx@testmachine ~]$ curl -i -L http://127.0.0.1:8000/app/test_redirect/
HTTP/1.1 302 Found
Date: Fri, 17 Apr 2020 05:52:48 GMT
Server: WSGIServer/0.2 CPython/3.7.1
Content-Type: text/html; charset=utf-8
Location: /app/test_page/
X-Frame-Options: SAMEORIGIN
Content-Length: 0
Vary: Cookie
HTTP/1.1 200 OK
Date: Fri, 17 Apr 2020 05:52:48 GMT
Server: WSGIServer/0.2 CPython/3.7.1
Content-Type: text/html; charset=utf-8
X-Frame-Options: SAMEORIGIN
Content-Length: 169
Vary: Cookie
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Test Page</title>
</head>
<body>
<h2>This is a page to test curl usage</h2>
</body>
</html>
可以看到经过一次跳转到最终页面,并成功返回。
访问API接口
不过,要说curl真正方便的地方在于测试后端开发的API,功能几乎和python中requests库或者urllib库差不多。
GET方法和POST方法
通过-X
来指定请求时的HTTP方法,因为很多高内聚的后端,同一个url对于GET和POST的反馈是不一样的。
[fuhx@testmachine ~]$ curl -X GET http://127.0.0.1:8000/app/test_api/
{"message": "Get successfully", "userid": null}
通常来讲POST方法用的较多,GET方法可以省略不写。
这里注意返回的Json数据,userid
的值为空,因为这个值我是通过cookie来获取的,这里还没有传递cookie到后端,所以会显示为空。
添加POST传递数据
下面试一下POST方法,使用POST方法通常是为了往服务器传递数据,可以利用-d
来完成。值得注意的是,后面需要用带大括号键值对的方式去传递。
需要注意的是,shell里面单引号是原因输出,双引号会进行转义。因为大括号是特殊字符,所以包裹大括号的用单引号,而里面包裹字符串的用双引号
[fuhx@testmachine ~]$ curl -X POST -d '{"name":"xiaofu"}' http://127.0.0.1:8000/app/test_api/
{"name": "xiaofu", "age": 99}
如果是传递多个字段,用类似字典的方式,逗号隔开
[fuhx@testmachine ~]$ curl -X POST -d '{"name":"xiaofu","sex":"male"}' http://127.0.0.1:8000/app/test_api/
{"name": "xiaofu", "age": 99}
自定义Header信息
如果有写过爬虫的朋友应该对Header不陌生,因为要模拟浏览器,所以要尽量在Header中添加信息来伪装,例如referer和user-agent。curl中通过-H
来添加Header信息,后面同样是跟键值对,不过不需要大括号。
[fuhx@testmachine ~]$ curl -X POST -d '{"name":"xiaofu"}' -H 'User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36' http://127.0.0.1:8000/app/test_api/
{"name": "xiaofu", "age": 99}
为了方便,有一些Header信息可以利用专门的参数去传递。例如-A
传递User-Agent信息,-e
传递Referer信息等等,这里不单独举例了。
添加Cookie数据
做为会话技术的一种,cookie是存储在客户端的信息,随请求传递给服务端做一些认证工作。利用-b
来传递键值对做为cookie,也不需要大括号,不过需要用等号连接键值对
[fuhx@testmachine ~]$ curl -b 'userid=123' http://127.0.0.1:8000/app/test_api/
{"message": "Get successfully", "userid": "123"}