目录
- 引言: Curl,你的网络世界“瑞士军刀” 🛠️
- 什么是 Curl?它能干啥? 🤔
- 基础入门:第一次亲密接触 👋
- 发送不同类型的请求 (HTTP Methods) 📨
- 传递数据: GET 参数、POST 数据和文件上传 📦📤
- 设置请求头 (Headers) 👋✉️
- 查看响应头 (-i 或 --include) 👀
- 只看响应头 (-I 或 --head) 👂
- 保存输出到文件 (-o 或 -O) 💾
- 查看请求和响应过程 (-v 或 --verbose) 🕵️♂️
- 处理重定向 (-L 或 --location) ↩️➡️
- 处理认证 (-u 或 --user) 🔑
- 处理 Cookies (-b 和 -c) 🍪
- 处理 HTTPS 和 SSL 证书 (-k 或 --insecure) 🔒⚠️
- 设置超时 (--connect-timeout 和 --max-time) ⏱️
- 使用代理 (-x 或 --proxy) 🔄
- 控制输出信息 (-s 或 --silent, -S 或 --show-error) 🤫📢
- 其他常用选项 (快速浏览) 🏃♂️💨
- Curl vs 浏览器:为何需要 Curl? 🤔💻
- 总结:掌握 Curl,网络无忧! 🎉
🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
其他优质专栏: 【🎇SpringBoot】【🎉多线程】【🎨Redis】【✨设计模式专栏(已完结)】…等
如果喜欢作者的讲解方式,可以点赞收藏加关注,你的支持就是我的动力
✨更多文章请看个人主页: 码熔burning
引言: Curl,你的网络世界“瑞士军刀” 🛠️
你好呀!作为一名幽默的程序员,今天我想跟你聊一个我们在日常工作中高频使用的命令行工具—— curl
!
可能你之前用过它简单地下载文件,或者在命令行里测试过几个API接口。但相信我,curl
的能力远不止于此!它就像一把网络世界的“瑞士军刀”,能帮你处理各种各样的网络请求,无论是简单的网页抓取,还是复杂的API调试,甚至是文件上传下载,它都能胜任。
掌握 curl
,能极大地提升你的开发、测试和问题排查效率。告别那些繁琐的GUI工具,用 curl
在终端里飞沙走石,你会发现自己瞬间变得更Geek、更高效!😎
这篇文章,我将带你从零开始,一步步深入 curl
的世界,力求涵盖它最常用、最核心的功能,让你也能成为一个熟练驾驭 curl
的网络请求高手! 💪
什么是 Curl?它能干啥? 🤔
简单来说,curl
是一个利用URL语法在命令行下工作的文件传输工具。它的名字是 “Client for URLs” 的缩写。
它的核心功能就是通过各种网络协议发送请求,然后接收并处理响应数据。你可以把它想象成一个没有漂亮界面的浏览器,或者是一个非常听话、可以高度定制的网络请求机器人。🤖
curl
支持超多种协议,包括但不限于:
- 最常用的: HTTP, HTTPS (网页访问、API请求)
- 文件传输: FTP, FTPS, SCP, SFTP, TFTP (文件上传下载)
- 邮件相关: POP3, POP3S, IMAP, IMAPS, SMTP, SMTPS
- 其他: DICT, TELNET, LDAP, LDAPS, FILE, RTMP, RTSP, GOPHER, MQTT
看到没?几乎涵盖了你在网络世界里会遇到的所有基本通信方式!
基础入门:第一次亲密接触 👋
使用 curl
最简单的方式,就是直接在后面加上你想访问的URL:
curl https://www.baidu.com
执行这个命令后,curl
会发送一个默认的 GET
请求到 https://www.baidu.com
,然后把服务器返回的网页网页内容(HTML、CSS、JS等)直接打印到你的终端屏幕上。
# 终端可能会输出类似下面的内容 (这是 baidu.com 的示例网页内容)
这就像你对一个网址喊了一嗓子“把你的内容给我看看!”,然后它就把内容一股脑丢给你了。 📢📄
默认情况下,curl
使用 GET
方法,并将收到的响应体(Body)输出到标准输出(也就是你的终端)。
发送不同类型的请求 (HTTP Methods) 📨
在与API交互时,我们经常需要使用不同的HTTP方法,比如 POST
、PUT
、DELETE
等。curl
使用 -X
或 --request
选项来指定请求方法。
# 发送一个 POST 请求
curl -X POST https://api.example.com/users
# 发送一个 DELETE 请求
curl -X DELETE https://api.example.com/users/123
# 发送一个 PUT 请求
curl -X PUT https://api.example.com/products/abc
这就像你跟服务器说:“我这次不是来看看(GET)的,我是来 提交点东西(POST) 的!”或者“我是来**删除(DELETE)**某个东西的!” 🗣️➡️📦
传递数据: GET 参数、POST 数据和文件上传 📦📤
网络请求经常需要附带数据。curl
提供了多种方式来发送数据。
1. GET 请求参数
对于 GET
请求,参数通常直接附加在URL后面,用 ?
隔开,多个参数用 &
连接:
curl "https://api.example.com/search?query=curl&page=1"
注意: 如果URL中包含特殊字符(如 &
),最好用双引号 ""
将URL括起来,避免被Shell解释器误解。
2. POST 或 PUT 请求数据 (-d
或 --data
)
POST
和 PUT
请求的数据通常放在请求体(Request Body)中。curl
使用 -d
或 --data
选项来发送数据。
-
发送简单的键值对 (URL 编码):
curl
默认会将-d
后面的数据进行 URL 编码,并自动设置Content-Type: application/x-www-form-urlencoded
。curl -X POST -d "username=testuser&password=123456" https://api.example.com/login
-
发送原始数据 (Raw Body):
如果你的数据是 JSON、XML 或其他格式,并且不想进行 URL 编码,可以直接在-d
后面跟着字符串。此时,你需要手动设置Content-Type
头(后面会讲如何设置头)。curl -X POST -d '{"name": "New User", "email": "newuser@example.com"}' \ -H "Content-Type: application/json" \ https://api.example.com/users
这里的
\
是换行符,为了让命令更易读。 -
从文件读取数据:
如果你的数据很多或很复杂(比如一个大型 JSON 文件),可以使用@
符号从文件中读取数据作为请求体。# data.json 文件的内容:{"name": "File User", "email": "fileuser@example.com"} curl -X POST -d @data.json \ -H "Content-Type: application/json" \ https://api.example.com/users
这就像把文件内容“粘贴”到请求体里发送出去。📄➡️📦
3. 发送表单数据或上传文件 (-F 或 --form)
对于 multipart/form-data
类型的请求(常用于网页表单提交或文件上传),使用 -F
或 --form
选项。
-
发送键值对 (模拟表单字段):
curl -X POST -F "username=testuser" -F "password=123456" https://api.example.com/login
-
上传文件:
在键值对中,如果值前面加上@
符号,curl
会将其视为文件路径并读取文件内容作为该字段的值。# 上传一个文件,字段名为 profile_picture,文件是 avatar.jpg curl -X POST -F "username=testuser" -F "profile_picture=@/path/to/avatar.jpg" https://api.example.com/upload
这就像你在网页上点击“选择文件”按钮,然后选择了文件上传。📁⬆️🌐
设置请求头 (Headers) 👋✉️
HTTP 请求头包含了很多元信息,比如内容类型 (Content-Type
)、认证信息 (Authorization
)、来源 (Referer
)、用户代理 (User-Agent
) 等等。curl
使用 -H
或 --header
选项来设置请求头。
# 设置 Content-Type 为 application/json
curl -H "Content-Type: application/json" https://api.example.com/data
# 设置 Authorization 头 (例如用于携带 token)
curl -H "Authorization: Bearer your_access_token" https://api.example.com/secure_data
# 设置 User-Agent 头 (模拟不同的浏览器或客户端)
curl -H "User-Agent: MyAwesomeCurlClient/1.0" https://www.example.com
你可以设置多个 -H
选项来添加多个请求头。这就像你在给你的网络请求信件的信封上写上各种附加信息。✉️🔖
查看响应头 (-i 或 --include) 👀
默认情况下,curl
只输出响应体。如果你想看到服务器返回的响应头(比如状态码、Content-Type
、Set-Cookie
等),可以使用 -i
或 --include
选项。
curl -i https://www.example.com
输出会先是响应头,然后空一行,接着是响应体。
# 响应头示例
HTTP/1.1 200 OK
Date: Mon, 18 Oct 2024 10:00:00 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 1256
Connection: keep-alive
# ... 其他头部
# 响应体示例 (example.com 的 HTML 内容)
<!doctype html>
<html>
...
</html>
只看响应头 (-I 或 --head) 👂
如果你只需要检查请求是否成功或者看看响应头信息(比如文件大小、类型),而不需要下载整个响应体,可以使用 -I
或 --head
选项。这会发送一个 HEAD
请求。
curl -I https://www.example.com/largefile.zip
这只会返回类似这样的头部信息:
HTTP/1.1 200 OK
Date: Mon, 18 Oct 2024 10:00:00 GMT
Content-Type: application/zip
Content-Length: 104857600 # 你可以看到文件大小!
Connection: keep-alive
# ... 其他头部
这就像你去敲门问:“请问您在家吗?(HEAD请求)”,而不是直接冲进去查看(GET请求)。🚪🕵️♀️
保存输出到文件 (-o 或 -O) 💾
默认输出到终端有时候不太方便,特别是当你想保存下载的内容时。curl
提供了 -o
和 -O
选项来保存输出。
-
-o [文件名]
: 将输出保存到指定的文件名。curl https://www.example.com/index.html -o my_homepage.html # 下载一个文件并指定保存位置和文件名 curl https://www.example.com/files/document.pdf -o /tmp/mydoc.pdf
-
-O
: 根据URL中远程文件的名字来保存文件。curl -O https://www.example.com/images/logo.png # 会保存为 logo.png curl -O https://cdn.example.com/scripts/main.js # 会保存为 main.js
这就像你下载文件时,给它起了个你想要的名字 (
-o
),或者让它用原来的名字 (-O
)。💾✍️
查看请求和响应过程 (-v 或 --verbose) 🕵️♂️
当你的请求没有按照预期工作时,-v
或 --verbose
选项是你的好帮手。它会显示 curl
执行请求时的详细信息,包括连接过程、发送的请求头、接收的响应头等等。
curl -v https://www.example.com
输出会包含以 *
开头的连接信息,以 >
开头的发送的请求头,以及以 <
开头的接收的响应头。
* Trying 93.184.216.34:443...
* Connected to www.example.com (93.184.216.34) port 443 (#0)
* ALPN: offers h2
* ALPN: offers http/1.1
... (SSL/TLS 握手信息)
> GET / HTTP/1.1
> Host: www.example.com
> User-Agent: curl/7.81.0 # 默认的 User-Agent
> Accept: */*
>
< HTTP/1.1 200 OK # 服务器返回的状态码和协议
< Date: Mon, 18 Oct 2024 10:00:00 GMT
< Content-Type: text/html; charset=UTF-8
... (其他响应头)
# 响应体内容 ...
这个 -v
选项就像给 curl
安了一个监视器 🎥,让你能清清楚楚地看到它和服务器之间的“对话”过程,非常有助于定位问题!
处理重定向 (-L 或 --location) ↩️➡️
当访问一个URL时,服务器有时会返回一个重定向响应(状态码 3xx),告诉你“这个资源搬家了,请去另一个地址找!”。默认情况下,curl
不会跟随重定向。
使用 -L
或 --location
选项,curl
会自动跟随服务器返回的重定向地址,直到找到最终的资源。
# 访问一个可能会重定向的短链接或旧地址
curl -L http://short.example.com/old_link
这就像你按照一个旧地址去找人,结果发现门上贴了个条子写着“我搬到xxx去了!”,然后你就会拿着新地址继续去找。curl -L
就是自动帮你完成“拿着新地址继续找”这个步骤。📍🚶♀️
处理认证 (-u 或 --user) 🔑
如果需要访问需要身份验证的资源(比如一些API或受保护的网页),可以使用 -u
或 --user
选项提供用户名和密码。
# 使用 HTTP Basic Authentication
curl -u "myuser:mypassword" https://api.example.com/protected_data
curl
会根据协议类型自动采用合适的认证方式(如 HTTP Basic 或 Digest 认证)。这就像你在访问一个需要门禁卡的地方时,刷一下你的卡并输入密码。💳🔑
处理 Cookies (-b 和 -c) 🍪
Cookies 是网站用来识别用户身份或记录状态的小甜饼。🍪 curl
可以发送和接收 Cookies。
-
-b [文件或字符串]
: 发送 Cookies。可以指定一个文件(通常是之前用-c
保存的)或直接指定 Cookie 字符串。# 从文件发送 Cookies curl -b cookies.txt https://www.example.com/profile # 直接指定 Cookie 字符串 curl -b "sessionid=abcdef123456; username=testuser" https://www.example.com/profile
-
-c [文件名]
: 将接收到的 Cookies 保存到文件。# 登录并将会话 Cookies 保存到文件 curl -c cookies.txt -d "username=test&password=..." https://www.example.com/login # 之后可以用 -b cookies.txt 来访问需要登录的页面 curl -b cookies.txt https://www.example.com/protected_page
这就像你在访问网站时,带上之前它给你的“通行证”(
-b
),或者把网站新给你的“通行证”收好 (-c
),以便下次使用。🎫🎒
处理 HTTPS 和 SSL 证书 (-k 或 --insecure) 🔒⚠️
curl
默认支持 HTTPS,并且会验证服务器的 SSL/TLS 证书,确保你连接的是合法的服务器。如果证书验证失败(比如证书过期、自签名证书等),curl
会报错并拒绝连接。
curl https://www.example.com # 正常验证
如果你访问的 HTTPS 网站使用了自签名证书或者证书有问题(比如在内部测试环境),而你又想强制连接,可以使用 -k
或 --insecure
选项。
# **极不安全!只用于测试或信任的环境!**
curl -k https://internal-test-server/api
🚨 警告: 使用 -k
会禁用证书验证,使你的连接容易受到中间人攻击!千万不要在生产环境或处理敏感数据时使用这个选项! 它就像你在一个危险的区域,明知道门锁坏了还硬闯进去,风险自负!🚪☠️
设置超时 (–connect-timeout 和 --max-time) ⏱️
网络不稳定或服务器响应慢时,请求可能会长时间挂起。你可以设置超时时间来避免无限等待。
--connect-timeout [秒]
:设置连接超时时间。如果在指定时间内无法建立连接,curl
会放弃。--max-time [秒]
:设置整个传输过程的最大允许时间。如果在指定时间内传输未完成,curl
会中断。
# 连接超时 5 秒,总传输超时 10 秒
curl --connect-timeout 5 --max-time 10 https://slow-server.example.com/data
这就像你给快递小哥设定了时间限制:“如果在5分钟内没联系上收件人,就别等了;整个派送过程不能超过10分钟!” ⏰🏍️
使用代理 (-x 或 --proxy) 🔄
如果你需要通过代理服务器来访问互联网,可以使用 -x
或 --proxy
选项。
# 使用 HTTP 代理
curl -x http://proxy.example.com:8080 https://www.example.com
# 使用 SOCKS5 代理
curl -x socks5://user:password@proxy.example.com:1080 https://www.example.com
这就像你不直接去目的地,而是让你的朋友(代理服务器)帮你去拿东西。🧍➡️🧍♂️➡️📦
控制输出信息 (-s 或 --silent, -S 或 --show-error) 🤫📢
curl
默认会显示一个进度条,告诉你下载/上传的进度。有时候在脚本里你不想要这个进度条,或者只想要错误信息。
-s
或--silent
:静默模式,完全不显示进度条和错误信息。-S
或--show-error
:通常与-s
一起使用,静默模式下只显示错误信息。
# 静默下载,不显示进度条
curl -s -O https://www.example.com/largefile.zip
# 静默执行,如果出错则显示错误信息
curl -sS https://api.example.com/sometimes_fails
-s
就像让 curl
悄悄地干活,不吭声。🤫 -S
就像让它只在出了问题时才“哎哟”一声。😖
其他常用选项 (快速浏览) 🏃♂️💨
-A [字符串]
或--user-agent [字符串]
:设置User-Agent
头。--limit-rate [速度]
:限制数据传输速度,例如100K
(100KB/s),1M
(1MB/s)。-T [文件名]
或--upload-file [文件名]
:使用 PUT 方法上传文件(常用于 FTP/SFTP 或支持 PUT 上传的 HTTP 服务器)。--compressed
: 请求时带上Accept-Encoding: gzip, deflate
头,如果服务器支持则会返回压缩后的数据,curl
会自动解压。-Z
或--parallel
: 并行下载多个文件(当后面跟多个URL时)。
Curl vs 浏览器:为何需要 Curl? 🤔💻
你可能会想,我用浏览器也能访问网页、测试API啊,为什么还需要 curl
呢?
- 脚本化和自动化:
curl
可以在脚本中轻松调用,非常适合自动化任务,比如定时检测网站可用性、批量下载文件等。 - 精细控制:
curl
允许你对请求的每一个细节进行精确控制,比如请求方法、头部、数据、证书、代理等,这对于API调试和问题排查至关重要。浏览器通常会自动处理很多细节,有时反而会干扰你的判断。 - 查看原始请求/响应: 使用
-v
等选项,你可以清晰地看到curl
发送和接收的原始数据,这在调试网络问题时非常有帮助。 - 支持多种协议:
curl
不仅限于 HTTP/HTTPS,还能处理 FTP、SMTP 等多种协议,功能更全面。 - 无界面: 没有图形界面,消耗资源少,可以在服务器等无头环境运行。
可以说,浏览器是为了方便用户浏览网页设计的,而 curl
则是为了方便开发者、测试人员和系统管理员进行网络交互和调试设计的。它们是不同的工具,服务于不同的目的。
总结:掌握 Curl,网络无忧! 🎉
恭喜你!读到这里,你已经掌握了 curl
最核心、最实用的知识了!从最简单的请求,到发送数据、设置头部、处理认证和Cookie,再到调试和保存输出,curl
的强大之处正逐渐展现在你眼前。
记住,curl
的选项多如牛毛,我们今天讲的只是冰山一角。当你遇到特定需求时,最好的方法是查阅官方文档 (man curl
命令或在线手册) 来找到最合适的选项。
将 curl
集成到你的日常工作流程中吧!你会发现它能解决你很多网络相关的痛点,让你在处理网络问题时更加游刃有余。
去尝试、去实践吧!用 curl
发送你的第一个 POST
请求,用 -v
看看它的“内心戏”,用 -O
下载一个文件… 很快,你就能熟练地舞动这把网络世界的“瑞士军刀”了!🚀