cURL的使用方法

电子说

1.3w人已加入

描述

 

 

 

认识 cURL

A command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, POP3, POP3S, RTMP, RTMPS, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET and TFTP. libcurl offers a myriad of powerful features

curl 是常用的开源命令行工具,用来请求 Web 服务器。它的名字就是客户端(client)的 URL 工具的意思。它的功能非常强大,命令行参数多达几十种。它支持包括 FTP、HTTP、HTTPS、FTP、SCP,SFTP 数十种协议。如能熟练使用,可以在很多应用场景下,发挥巨大的价值。

cURL 的使用

代替 Postman ?

curl https://www.baidu.com

如上命令,不带有任何参数时,curl 就是发出 GET 请求,服务器返回的内容会在命令行输出。当然,你还可以为其添加各种参数(如 -A、-b、-c、-d、-e、-F、-H 等等),使得可以完成更多复杂任务;

其实,如果只是简单的 Post、Get 请求,用 cURL 做像接口测试的工作是非常方便的。

有人说了,Postman 它不香吗?

是的,挺香的,但是当你在环境受限的情况下,比如 在 linux 服务器上想测试一下接口通不通没有 Postman 怎么办?

这时候 cURL 就体现出它的价值了。此外贴心的 Postman,还为我们提供了各种语言和 cURL 的 snippet,方便你在 Postman 编辑完成后直接拿走开发和调试使用。

开源

如上图,你直接 copy 内容,然后在命令行执行就可以了。

开源

小工具了解一下

jsonplaceholder http://jsonplaceholder.typicode.com/

免费的 HTTP 请求假数据接口,前端同学可以了解一下

  • 不需引入外部 js 文件。
  • 同时支持 http 和 https 请求。
  • 同时支持 post 请求和 get 请求。

看看 cookie?

curl -b cookies.txt https://www.youku.com

上面命令将服务器的 HTTP 回应所设置 Cookie 写入文本文件 cookies.txt。

上传个文件?

网站中上传文件功能很普遍,然而你是怎么调试的呢?

打开页面,选择文件后再点击上传按钮?然后 F12 看看 Request、Response?  或者打开 Postman 进行类似步骤?

可真够麻烦的。用 cURL 一行命令搞定

这里先介绍一下 -v 参数:

使用 -v 参数使 curl 打印有关请求和响应的详细信息。以 > 为前缀的行是发送给服务器的数据,以 < 为前缀的行是从服务器接收的数据,以 * 开头的行是杂项信息,如连接信息、SSL 握手信息、协议信息等。

我们看个例子,搞下百度:

❯ curl -v  https://www.baidu.com 
*   Trying 110.242.68.3:443...
* Connected to www.baidu.com (110.242.68.3) port 443 (#0)
* ALPN: offers h2
* ALPN: offers http/1.1
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
* ALPN: server accepted http/1.1
* Server certificate:
*  subject: C=CN; ST=beijing; L=beijing; OU=service operation department; O=Beijing Baidu Netcom Science Technology Co., Ltd; CN=baidu.com
*  start date: Jul  5 0502 2022 GMT
*  expire date: Aug  6 0501 2023 GMT
*  subjectAltName: host "www.baidu.com" matched cert's "*.baidu.com"
*  issuer: C=BE; O=GlobalSign nv-sa; CN=GlobalSign RSA OV SSL CA 2018
*  SSL certificate verify ok.
> GET / HTTP/1.1
> Host: www.baidu.com
> User-Agent: curl/7.83.1
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Accept-Ranges: bytes
< Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
< Connection: keep-alive
< Content-Length: 2443
< Content-Type: text/html
< Date: Fri, 22 Jul 2022 1009 GMT
< Etag: "588603e2-98b"
< Last-Modified: Mon, 23 Jan 2017 1346 GMT
< Pragma: no-cache
< Server: bfe/1.0.8.18
< Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/
<

 百度一下,你就知道         
         
 
  新闻 hao123 地图 视频 贴吧   更多产品 
 
     关于百度 About Baidu 

 ©2017 Baidu 使用百度前必读  意见反馈  京 ICP 证 030173 号   

      * Connection #0 to host www.baidu.com left intact

可以看到,包括握手过程、请求、响应信息一应俱全。

加 -v 参数的作用就是就是为了跟踪(trace)一下请求,看看具体细节,这跟你 F12 的目的是一样的。此外,如果你想看到具体的请求、响应时间点可以加入 --trace-time 参数,最后的命令如下:

curl -v  --trace-time  https://www.baidu.com

效果是这样的:

❯ curl -v  --trace-time  https://www.baidu.com
1850.680025 *   Trying 110.242.68.4:443...
1850.692744 * Connected to www.baidu.com (110.242.68.4) port 443 (#0)
1850.693142 * ALPN: offers h2
1850.693165 * ALPN: offers http/1.1
1850.706507 * TLSv1.3 (OUT), TLS handshake, Client hello (1):
1850.723346 * TLSv1.3 (IN), TLS handshake, Server hello (2):
1850.723509 * TLSv1.2 (IN), TLS handshake, Certificate (11):
1850.724242 * TLSv1.2 (IN), TLS handshake, Server key exchange (12):
1850.724370 * TLSv1.2 (IN), TLS handshake, Server finished (14):
1850.724572 * TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
1850.724628 * TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
1850.724727 * TLSv1.2 (OUT), TLS handshake, Finished (20):
1850.740045 * TLSv1.2 (IN), TLS handshake, Finished (20):
1850.740086 * SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
1850.740105 * ALPN: server accepted http/1.1
1850.740129 * Server certificate:
1850.740160 *  subject: C=CN; ST=beijing; L=beijing; OU=service operation department; O=Beijing Baidu Netcom Science Technology Co., Ltd; CN=baidu.com
1850.740182 *  start date: Jul  5 0502 2022 GMT
1850.740200 *  expire date: Aug  6 0501 2023 GMT
1850.740256 *  subjectAltName: host "www.baidu.com" matched cert's "*.baidu.com"
1850.740298 *  issuer: C=BE; O=GlobalSign nv-sa; CN=GlobalSign RSA OV SSL CA 2018
1850.740317 *  SSL certificate verify ok.
1850.740391 > GET / HTTP/1.1
1850.740391 > Host: www.baidu.com
1850.740391 > User-Agent: curl/7.83.1
1850.740391 > Accept: */*
1850.740391 >
1850.753580 * Mark bundle as not supporting multiuse
1850.753605 < HTTP/1.1 200 OK
1850.753623 < Accept-Ranges: bytes
1850.753641 < Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
1850.753661 < Connection: keep-alive
1850.753680 < Content-Length: 2443
1850.753703 < Content-Type: text/html
1850.753725 < Date: Fri, 22 Jul 2022 1050 GMT
1850.753762 < Etag: "588603e2-98b"
1850.753789 < Last-Modified: Mon, 23 Jan 2017 1346 GMT
1850.753809 < Pragma: no-cache
1850.753831 < Server: bfe/1.0.8.18
1850.753856 < Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/
1850.753878 <

接下来就是上传的部分了,-F 参数用来向服务器上传二进制文件。

❯ curl -v --trace-time  'https://postman-echo.com/post' -F  'fileName=@"/Users/xiaobox/Desktop/cookies.txt"'

解释一下这行命令:

-F 参数可以指定 MIME 类型,也可以改文件名。

curl -v --trace-time  'https://postman-echo.com/post' -F  'fileName=@/Users/xiaobox/Desktop/cookies.txt;type=text/plain;filename=me.txt'

最后总结,如果你想用一条 cURL 命令测试上传接口,可以利用类似下面的参数组合:

curl -v --trace-time  'https://postman-echo.com/post' -F  'fileName=@/Users/xiaobox/Desktop/cookies.txt;type=text/plain;filename=me.txt'

弱网测试

顾名思义,就是模拟你的客户端用户在网络较差的环境下,比如 网速很低的时候,网络请求的情况。

我们还是拿百度举例子,你可以用以下一组命令在 1k 和 200B 的不同速度下对比看看响应情况:

curl -v --trace-time --limit-rate 1k http://www.baidu.com

curl -v --trace-time --limit-rate 200B http://www.baidu.com

注意 limit-rate 是同时限制  request 和 response,也就是 请求、响应都限制成一样的速率了。

自动重定向

❯ curl  https://www.bilibili.com
Redirecting to "//www.bilibili.com/?rt=V%2FymTlOu4ow%2Fy4xxNWPUZ91QLE3Z%2BfhZ8P5SQVD30Nw%3D">//www.bilibili.com/?rt=V%2FymTlOu4ow%2Fy4xxNWPUZ91QLE3Z%2BfhZ8P5SQVD30Nw%3D.%

你看到了 B 站给我们重定向了,我们可以利用 -L 参数让 cURL 自动重定向。

curl -L httsp://www.bilibili.com

注意 是大写的 L

科学上网后 cURL 不通?

假设你已经配置了科学上网,我们直接 cURL google 看一下

❯ curl -v  https://www.google.com
*   Trying 74.86.151.167:443...
* connect to 74.86.151.167 port 443 failed: Operation timed out
* Failed to connect to www.google.com port 443 after 75400 ms: Operation timed out
* Closing connection 0
curl: (28) Failed to connect to www.google.com port 443 after 75400 ms: Operation timed out

一般情况下是失败的

再假设你用的 VPN 客户端是 clashX 因为我用的是这个,就用这个举例。

开源

点击 “复制终端代理命令”,然后在你的终端执行一下:

❯ export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7890

再用 cURL, 你会发现就可以成功了。如果你用的不是 clashX 其他的 VPN 客户端应该也有类似功能

保存响应内容 ?

可以利用 -o 参数将响应的结果保存到文件中:

 curl -o google.txt https://www.google.com

下载文件并显示进度?

cURL 可以当 wget 用

-o 参数将服务器的回应保存成文件,等同于 wget 命令

下载文件的同时显示进度可以使用类似下面的命令:

❯ curl -# -o pic.jpg https://w.wallhaven.cc/full/pk/wallhaven-pk6993.png

参数太多,不想拼?

cURL 是好用,但如果我是个 web 应用,需要拼接一堆参数,那太麻烦了,简直劝退。

是的,所以 浏览器也想到了,你可以在浏览器先正常发出请求,然后利用浏览器的工具将 cURL 的命令复制出来。

开源

可以复制单个请求,也可以是页面的所有请求。然后你就可以粘贴到终端执行了。

是不是很方便 ?

获取所在地 IP

curl -L tool.lu/ip
# or
curl -L ip.tool.lu
开源

获取天气预报?

我们看看北京的:

curl 'wttr.in/Beijing?lang=zh'
开源

吐槽苹果

这是一则去年关于 cURL 的旧新闻:https://www.163.com/dy/article/GTOGN8D20544B1XD.html

curl 作者吐槽苹果把他当做免费工具人

了解这样的新闻可以帮助你更深刻地认识开源、商业以及整个软件的生态情况。
  审核编辑:汤梓红


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

登录/注册
×
20
完善资料,
赚取积分