小肚教你如何写 curl 来调用接口

593 阅读2分钟

hello, 我正在参加年度创作者人气评选,可以 点击这里 给作者投票来鼓励技术原创与开源哦!!万分感谢

作为前端开发,在和后端联调的过程中,是不是总会听后端同学讲:“你不要老是截图,把 curl 发我一下吧”。第一次听是不是有些懵,不知道是什么意思呀。本文就讲解一下 curl 到底是什么,该如何使用 curl 来调试接口呢?

什么是 curl

其名字是一个组合词汇,就是客户端(client)的 URL 工具的意思(c-url),是一个操作系统内置的命令行工具,通过这个工具可以直接请求 web 服务器。

较权威的文档,可以参考 Curl Cookbook

其返回值就是你通过各种参数想要获取的网络响应。

我们来看个例子。

直接来请求一下网址响应:curl https://bilibili.com:

image.png

返回的是响应的html。为什么是 301 呢?这个域名被服务器转发了,重定向到了 www.bilibili.com. 我们再试一下,可以看到获取到网站的html了:

image.png

但是从上面的响应可以看到,进入到了哔哩哔哩的登陆页面了,我想带着真正信息获取页面元素怎么办呢?这就需要使用 curl 的参数传递了。

curl 作用

  1. 检查服务器响应是否正常
  2. 模拟 ajax 请求,检查响应结构是否正确
  3. 获取网络资源到本地 & 上传数据到服务器
  4. 进行网络攻击,比如 DDos
  5. ...

curl 的常用参数

-X 指定 HTTP 请求的方法

这个好理解,不指定默认是 GET 请求,下面使用 POST 获取网址看看:

$ curl -X POST https://www.bilibili.com

哈哈,服务器拒绝响应:

image.png

我们使用豆瓣公开的API试试:

image.png

可以看到响应体已经返回。只不过现在的豆瓣API需要key才能请求,所以状态码是 403.

-d 向服务器发送请求体 (request body)

curl -v -d 'login=小肚肚&password=123'-X POST https://www.bilibili.com/login

可以看到,默认是 application/x-www-form-urlencoded 格式的请求体:

image.png

-H 设置请求头

添加请求头(request header),比如携带 token 等。使用示例:

curl -X POST -H "X-accessToken: abc123xyz" -H "Content-Type: application/json" -d '{"key":"value"}' https://api.example.com

我们试着模拟日常调试 API:

curl -X POST \
     -H "Content-Type: application/json" \
     -d '{"a": 123}' \
     https://api.bilibili.com

多行输入,用反斜杠隔开

可以看到,请求头 Content-type 也修改成功了:

image.png

如果想查看更详细的执行日志,可以加上参数 --trace:

curl -X POST \
     -H "Content-Type: application/json" \
     -d '{"a": 123}' \
     --trace curl.log \
     https://api.bilibili.com

这样就将日志存到本地文件里了,打开文件可以看到详细的输出:

image.png

-b 向服务器发送cookie

例子:

curl -v -b 'p1=bar;p2=bar2' https://www.bilibili.com

-v 是进入详细模式查看响应

image.png

可以看到请求头的 cookie 已经设置成功。

-u 设置Authorization认证请求头

curl -v -i -u 'bob:12345' https://baidu.com/login

image.png

上面命令设置用户名为bob,密码为12345,然后将其转为 HTTP 标头Authorization: Basic J2JvYjoxMjM0NSc=

当然了,一般情况下,Authorization: Basic 安全性欠佳,一般使用这样设置认证头:

curl -H "Authorization: Bearer <your-bearer-token>" <your-url>

-c 将服务器设置的 Cookie 写入一个文件

$ curl -c hello.txt https://www.bilibili.com

这个操作用于将 http 请求回应的设置好的 cookie 本地持久化。

-F 模拟表单上传二进制文件

$ curl -F 'file=@photo.png;type=image/png' https://www.bilibili.com

类似的参数还有 --data-binary

-G 构造GET请求,并合并查询字符串

实际在请求接口时,如果使用的 -d 来发送数据,那么自动就会识别为 POST 请求,那么除了使用 -X,还可以使用 -G,他不但可以指定请求方式,还可以帮忙合并参数。

$ curl -G -d 'q=HBK08' -d 'count=20' https://bilibili.com/search

上面的指令相当于发出了这样的请求:

https://bilibili.com/search?q=HBK08&count=20

-k 跳过 SSL 检查

如果不加 -k,请求可能会因证书验证失败而中止。

如果要防止这样的访问,服务器可以配置 HSTS 头,告诉浏览器强制使用 HTTPS,并防止降级到 HTTP。

-o 将请求响应保存到文件

$ curl -o hello.html https://www.bilibili.com

curl 的应用

ci/cd 使用

发布系统(或者灰度系统)部署:

image.png

在ci文件中,可以使用 curl 来将打包好的文件上传到发布中心或者灰度系统来做统一的调配。

脱离浏览器环境调试接口

这个就不多说了。

有时候 curl 有代码调用所不能企及的便利性。

发起网络攻击

不要这么做

比如暴力破解密码、利用接口漏洞伪造身份登录、XSS、DDos 攻击等。