curl命令请求网页和API参数详解

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"}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值