认识 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 ?
curlhttps://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-bcookies.txthttps://www.youku.com
上面命令将服务器的 HTTP 回应所设置 Cookie 写入文本文件 cookies.txt。
上传个文件?
网站中上传文件功能很普遍,然而你是怎么调试的呢?
打开页面,选择文件后再点击上传按钮?然后 F12 看看 Request、Response? 或者打开 Postman 进行类似步骤?
可真够麻烦的。用 cURL 一行命令搞定
这里先介绍一下 -v 参数:
“使用 -v 参数使 curl 打印有关请求和响应的详细信息。以 > 为前缀的行是发送给服务器的数据,以 < 为前缀的行是从服务器接收的数据,以 * 开头的行是杂项信息,如连接信息、SSL 握手信息、协议信息等。
”
我们看个例子,搞下百度:
❯curl-vhttps://www.baidu.com
*Trying110.242.68.3:443...
*Connectedtowww.baidu.com(110.242.68.3)port443(#0)
*ALPN:offersh2
*ALPN:offershttp/1.1
*TLSv1.3(OUT),TLShandshake,Clienthello(1):
*TLSv1.3(IN),TLShandshake,Serverhello(2):
*TLSv1.2(IN),TLShandshake,Certificate(11):
*TLSv1.2(IN),TLShandshake,Serverkeyexchange(12):
*TLSv1.2(IN),TLShandshake,Serverfinished(14):
*TLSv1.2(OUT),TLShandshake,Clientkeyexchange(16):
*TLSv1.2(OUT),TLSchangecipher,Changecipherspec(1):
*TLSv1.2(OUT),TLShandshake,Finished(20):
*TLSv1.2(IN),TLShandshake,Finished(20):
*SSLconnectionusingTLSv1.2/ECDHE-RSA-AES128-GCM-SHA256
*ALPN:serveracceptedhttp/1.1
*Servercertificate:
*subject:C=CN;ST=beijing;L=beijing;OU=serviceoperationdepartment;O=BeijingBaiduNetcomScienceTechnologyCo.,Ltd;CN=baidu.com
*startdate:Jul505022022GMT
*expiredate:Aug605012023GMT
*subjectAltName:host"www.baidu.com"matchedcert's"*.baidu.com"
*issuer:C=BE;O=GlobalSignnv-sa;CN=GlobalSignRSAOVSSLCA2018
*SSLcertificateverifyok.
>GET/HTTP/1.1
>Host:www.baidu.com
>User-Agent:curl/7.83.1
>Accept:*/*
>
*Markbundleasnotsupportingmultiuse
< 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=/
<
百度一下,你就知道
*Connection#0tohostwww.baidu.comleftintact
可以看到,包括握手过程、请求、响应信息一应俱全。
加 -v 参数的作用就是就是为了跟踪(trace)一下请求,看看具体细节,这跟你 F12 的目的是一样的。此外,如果你想看到具体的请求、响应时间点可以加入 --trace-time 参数,最后的命令如下:
curl-v--trace-timehttps://www.baidu.com
效果是这样的:
❯curl-v--trace-timehttps://www.baidu.com
1850.680025*Trying110.242.68.4:443...
1850.692744*Connectedtowww.baidu.com(110.242.68.4)port443(#0)
1850.693142*ALPN:offersh2
1850.693165*ALPN:offershttp/1.1
1850.706507*TLSv1.3(OUT),TLShandshake,Clienthello(1):
1850.723346*TLSv1.3(IN),TLShandshake,Serverhello(2):
1850.723509*TLSv1.2(IN),TLShandshake,Certificate(11):
1850.724242*TLSv1.2(IN),TLShandshake,Serverkeyexchange(12):
1850.724370*TLSv1.2(IN),TLShandshake,Serverfinished(14):
1850.724572*TLSv1.2(OUT),TLShandshake,Clientkeyexchange(16):
1850.724628*TLSv1.2(OUT),TLSchangecipher,Changecipherspec(1):
1850.724727*TLSv1.2(OUT),TLShandshake,Finished(20):
1850.740045*TLSv1.2(IN),TLShandshake,Finished(20):
1850.740086*SSLconnectionusingTLSv1.2/ECDHE-RSA-AES128-GCM-SHA256
1850.740105*ALPN:serveracceptedhttp/1.1
1850.740129*Servercertificate:
1850.740160*subject:C=CN;ST=beijing;L=beijing;OU=serviceoperationdepartment;O=BeijingBaiduNetcomScienceTechnologyCo.,Ltd;CN=baidu.com
1850.740182*startdate:Jul505022022GMT
1850.740200*expiredate:Aug605012023GMT
1850.740256*subjectAltName:host"www.baidu.com"matchedcert's"*.baidu.com"
1850.740298*issuer:C=BE;O=GlobalSignnv-sa;CN=GlobalSignRSAOVSSLCA2018
1850.740317*SSLcertificateverifyok.
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*Markbundleasnotsupportingmultiuse
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"'
解释一下这行命令:
- https://postman-echo.com/post 是我找到的一个公共 API,你可以用来测试上传文件
- -v --trace 上面讲过了
- -F 会给 HTTP 请求加上标头 Content-Type: multipart/form-data,然后将我桌面的文件 cookies.txt 作为 file 字段上传。
-F 参数可以指定 MIME 类型,也可以改文件名。
curl-v--trace-time'https://postman-echo.com/post'-F'fileName=@/Users/xiaobox/Desktop/cookies.txt;type=text/plain;filename=me.txt'
- 上面命令指定 MIME 类型为 text/plain,否则 curl 会把 MIME 类型设为 application/octet-stream
- 上面命令中,原始文件名为 cookies.txt,但是服务器接收到的文件名为 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-rate1khttp://www.baidu.com
curl-v--trace-time--limit-rate200Bhttp://www.baidu.com
注意 limit-rate 是同时限制 request 和 response,也就是 请求、响应都限制成一样的速率了。
自动重定向
❯curlhttps://www.bilibili.com
Redirectingto"//www.bilibili.com/?rt=V%2FymTlOu4ow%2Fy4xxNWPUZ91QLE3Z%2BfhZ8P5SQVD30Nw%3D">//www.bilibili.com/?rt=V%2FymTlOu4ow%2Fy4xxNWPUZ91QLE3Z%2BfhZ8P5SQVD30Nw%3D.%
你看到了 B 站给我们重定向了,我们可以利用 -L 参数让 cURL 自动重定向。
curl-Lhttsp://www.bilibili.com
注意 是大写的 L
科学上网后 cURL 不通?
假设你已经配置了科学上网,我们直接 cURL google 看一下
❯curl-vhttps://www.google.com
*Trying74.86.151.167:443...
*connectto74.86.151.167port443failed:Operationtimedout
*Failedtoconnecttowww.google.comport443after75400ms:Operationtimedout
*Closingconnection0
curl:(28)Failedtoconnecttowww.google.comport443after75400ms:Operationtimedout
一般情况下是失败的
再假设你用的 VPN 客户端是 clashX
因为我用的是这个,就用这个举例。
点击 “复制终端代理命令”,然后在你的终端执行一下:
❯exporthttps_proxy=http://127.0.0.1:7890http_proxy=http://127.0.0.1:7890all_proxy=socks5://127.0.0.1:7890
再用 cURL, 你会发现就可以成功了。如果你用的不是 clashX
其他的 VPN 客户端应该也有类似功能
保存响应内容 ?
可以利用 -o 参数将响应的结果保存到文件中:
curl-ogoogle.txthttps://www.google.com
下载文件并显示进度?
cURL 可以当 wget 用
-o 参数将服务器的回应保存成文件,等同于 wget 命令
下载文件的同时显示进度可以使用类似下面的命令:
❯curl-#-opic.jpghttps://w.wallhaven.cc/full/pk/wallhaven-pk6993.png
参数太多,不想拼?
cURL 是好用,但如果我是个 web 应用,需要拼接一堆参数,那太麻烦了,简直劝退。
是的,所以 浏览器也想到了,你可以在浏览器先正常发出请求,然后利用浏览器的工具将 cURL 的命令复制出来。
可以复制单个请求,也可以是页面的所有请求。然后你就可以粘贴到终端执行了。
是不是很方便 ?
获取所在地 IP
curl-Ltool.lu/ip
#or
curl-Lip.tool.lu
获取天气预报?
我们看看北京的:
curl'wttr.in/Beijing?lang=zh'
吐槽苹果
这是一则去年关于 cURL 的旧新闻:https://www.163.com/dy/article/GTOGN8D20544B1XD.html
curl 作者吐槽苹果把他当做免费工具人
了解这样的新闻可以帮助你更深刻地认识开源、商业以及整个软件的生态情况。
审核编辑:汤梓红
-
服务器
+关注
关注
12文章
8929浏览量
85047 -
开源
+关注
关注
3文章
3210浏览量
42286 -
Curl
+关注
关注
0文章
15浏览量
8155
原文标题:妙用 cURL
文章出处:【微信号:yikoulinux,微信公众号:一口Linux】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论