慣性聚合 高效追蹤和閱讀你感興趣的部落格、新聞、科技資訊
閱讀原文 在慣性聚合中打開

推薦訂閱源

博客园 - 司徒正美
V
V2EX
T
Tailwind CSS Blog
有赞技术团队
有赞技术团队
aimingoo的专栏
aimingoo的专栏
Apple Machine Learning Research
Apple Machine Learning Research
IT之家
IT之家
Blog — PlanetScale
Blog — PlanetScale
A
About on SuperTechFans
月光博客
月光博客
T
The Blog of Author Tim Ferriss
宝玉的分享
宝玉的分享
Martin Fowler
Martin Fowler
博客园 - 聂微东
The GitHub Blog
The GitHub Blog
V
Visual Studio Blog
WordPress大学
WordPress大学
酷 壳 – CoolShell
酷 壳 – CoolShell
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI

阮一峰的网络日志

科技爱好者周刊(第 396 期):互联网通信的替代方案 科技爱好者周刊(第 396 期):互联网通信的替代方案 - 阮一峰的网络日志 科技爱好者周刊(第 395 期):软件开发的第三种方式 科技爱好者周刊(第 395 期):软件开发的第三种方式 - 阮一峰的网络日志 科技爱好者周刊(第 393 期):脑腐状态 科技爱好者周刊(第 392 期):axios 投毒与好莱坞式骗术 科技爱好者周刊(第 391 期):AI 的贫富分化 科技爱好者周刊(第 390 期):没有语料,大模型就是智障 套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的"套壳"疑云 科技爱好者周刊(第 389 期):未来如何招聘程序员 科技爱好者周刊(第 388 期):测试是新的护城河 零安装的"云养虾":ArkClaw 使用指南 科技爱好者周刊(第 387 期):你是领先的 科技爱好者周刊(第 386 期):当外卖员接入 AI 字节全家桶 Seed 2.0 + TRAE 玩转 Skill 科技爱好者周刊(第 385 期):马斯克害怕中国车企吗? 智谱旗舰 GLM-5 实测:对比 Opus 4.6 和 GPT-5.3-Codex 科技爱好者周刊(第 384 期):为什么软件股下跌 科技爱好者周刊(第 383 期):你是第几级 AI 编程 Kimi 的一体化,Manus 的分层 科技爱好者周刊(第 382 期):独立软件的黄昏 AI native Workspace 也许是智能体的下一阶段 科技爱好者周刊(第 381 期):中国 AI 大模型领导者在想什么 科技爱好者周刊(第 380 期):为什么人们拥抱"不对称收益" 科技爱好者周刊(第 379 期):《硅谷钢铁侠》摘录 我如何用 AI 处理历史遗留代码:MiniMax M2.1 升级体验 科技爱好者周刊(第 378 期):预测是新的互联网热点 科技爱好者周刊(第 377 期):14万美元的贫困线 科技爱好者周刊(第 376 期):太空数据中心的争议 科技爱好者周刊(第 375 期):一扇门的 Bug 终于有人做了 Subagent,TRAE 国内版 SOLO 模式来了 科技爱好者周刊(第 374 期):6GHz 的问题 VS Code 使用国产大模型 MiniMax M2 教程 科技爱好者周刊(第 373 期):数据模型是新产品的核心 国产大模型接入 Claude Code 教程:以 Doubao-Seed-Code 为例 科技爱好者周刊(第 372 期):软件界面如何设计 大模型比拼:MiniMax M2 vs GLM 4.6 vs Claude Sonnet 4.5 科技爱好者周刊(第 371 期):一个乐观主义者的专访 科技爱好者周刊(第 370 期):正确的代码高亮 错误处理:异常好于状态码 科技爱好者周刊(第 369 期):Tim 与罗永浩的对谈 科技爱好者周刊(第 368 期):不要这样管理软件团队 一天之内,智谱和 Anthropic 都发了最强编程模型 科技爱好者周刊(第 367 期):Nano Banana 的几个妙用 科技爱好者周刊(第 366 期):旧金山疯狂的 AI 广告 科技爱好者周刊(第 365 期):流量变现正在崩塌 科技爱好者周刊(第 364 期):最难还原的魔方 科技爱好者周刊(第 363 期):最好懂的神经网络解释 科技爱好者周刊(第 362 期):GitHub 工程师谈系统设计 科技爱好者周刊(第 361 期):暗网 Tor 安全吗?
curl 的用法指南
阮一峰 · 2019-09-05 · via 阮一峰的网络日志

簡介

curl 是常用的命令行工具,用來請求 Web 服務器。它的名字就是客戶端(client)的 URL 工具的意思。

它的功能非常強大,命令行參數多達幾十種。如果熟練的話,完全可以取代 Postman 這一類的圖形界面工具。

本文介紹它的主要命令行參數,作為日常的參考,方便查閱。內容主要翻譯自《curl cookbook》。為了節約篇幅,下面的例子不包括運行時的輸出,初學者可以先看我以前寫的《curl 初學者教程》

不帶有任何參數時,curl 就是發出 GET 請求。


$ curl https://www.example.com

上面命令向www.example.com發出 GET 請求,服務器返回的內容會在命令行輸出。

-A

-A參數指定客戶端的用戶代理標頭,即User-Agent。curl 的默認用戶代理字符串是curl/[version]


$ curl -A 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36' https://google.com

上面命令將User-Agent改成 Chrome 瀏覽器。


$ curl -A '' https://google.com

上面命令會移除User-Agent標頭。

也可以通過-H參數直接指定標頭,更改User-Agent


$ curl -H 'User-Agent: php/1.0' https://google.com

-b

-b參數用來向服務器發送 Cookie。


$ curl -b 'foo=bar' https://google.com

上面命令會生成一個標頭Cookie: foo=bar,向服務器發送一個名為foo、值為bar的 Cookie。


$ curl -b 'foo1=bar;foo2=bar2' https://google.com

上面命令發送兩個 Cookie。


$ curl -b cookies.txt https://www.google.com

上面命令讀取本地文件cookies.txt,裡面是服務器設置的 Cookie(參見-c參數),將其發送到服務器。

-c

-c參數將服務器設置的 Cookie 寫入一個文件。


$ curl -c cookies.txt https://www.google.com

上面命令將服務器的 HTTP 回應所設置 Cookie 寫入文本文件cookies.txt

-d

-d參數用於發送 POST 請求的數據體。


$ curl -d'login=emma&password=123'-X POST https://google.com/login
# 或者
$ curl -d 'login=emma' -d 'password=123' -X POST  https://google.com/login

使用-d參數以後,HTTP 請求會自動加上標頭Content-Type : application/x-www-form-urlencoded。並且會自動將請求轉為 POST 方法,因此可以省略-X POST

-d參數可以讀取本地文本文件的數據,向服務器發送。


$ curl -d '@data.txt' https://google.com/login

上面命令讀取data.txt文件的內容,作為數據體向服務器發送。

--data-urlencode

--data-urlencode參數等同於-d,發送 POST 請求的數據體,區別在於會自動將發送的數據進行 URL 編碼。


$ curl --data-urlencode 'comment=hello world' https://google.com/login

上面代碼中,發送的數據hello world之間有一個空格,需要進行 URL 編碼。

-e

-e參數用來設置 HTTP 的標頭Referer,表示請求的來源。


curl -e 'https://google.com?q=example' https://www.example.com

上面命令將Referer標頭設為https://google.com?q=example

-H參數可以通過直接添加標頭Referer,達到同樣效果。


curl -H 'Referer: https://google.com?q=example' https://www.example.com

-F

-F參數用來向服務器上傳二進制文件。


$ curl -F '[email protected]' https://google.com/profile

上面命令會給 HTTP 請求加上標頭Content-Type: multipart/form-data,然後將文件photo.png作為file字段上傳。

-F參數可以指定 MIME 類型。


$ curl -F '[email protected];type=image/png' https://google.com/profile

上面命令指定 MIME 類型為image/png,否則 curl 會把 MIME 類型設為application/octet-stream

-F參數也可以指定文件名。


$ curl -F '[email protected];filename=me.png' https://google.com/profile

上面命令中,原始文件名為photo.png,但是服務器接收到的文件名為me.png

-G

-G參數用來構造 URL 的查詢字符串。


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

上面命令會發出一個 GET 請求,實際請求的 URL 為https://google.com/search?q=kitties&count=20。如果省略--G,會發出一個 POST 請求。

如果數據需要 URL 編碼,可以結合--data--urlencode參數。


$ curl -G --data-urlencode 'comment=hello world' https://www.example.com

-H

-H參數添加 HTTP 請求的標頭。


$ curl -H 'Accept-Language: en-US' https://google.com

上面命令添加 HTTP 標頭Accept-Language: en-US


$ curl -H 'Accept-Language: en-US' -H 'Secret-Message: xyzzy' https://google.com

上面命令添加兩個 HTTP 標頭。


$ curl -d '{"login": "emma", "pass": "123"}' -H 'Content-Type: application/json' https://google.com/login

上面命令添加 HTTP 請求的標頭是Content-Type: application/json,然後用-d參數發送 JSON 數據。

-i

-i參數打印出服務器回應的 HTTP 標頭。


$ curl -i https://www.example.com

上面命令收到服務器回應後,先輸出服務器回應的標頭,然後空一行,再輸出網頁的源碼。

-I

-I參數向服務器發出 HEAD 請求,然會將服務器返回的 HTTP 標頭打印出來。


$ curl -I https://www.example.com

上面命令輸出服務器對 HEAD 請求的回應。

--head參數等同於-I


$ curl --head https://www.example.com

-k

-k參數指定跳過 SSL 檢測。


$ curl -k https://www.example.com

上面命令不會檢查服務器的 SSL 證書是否正確。

-L

-L參數會讓 HTTP 請求跟隨服務器的重定向。curl 默認不跟隨重定向。


$ curl -L -d 'tweet=hi' https://api.twitter.com/tweet

--limit-rate

--limit-rate用來限制 HTTP 請求和回應的帶寬,模擬慢網速的環境。


$ curl --limit-rate 200k https://google.com

上面命令將帶寬限制在每秒 200K 字節。

-o

-o參數將服務器的回應保存成文件,等同於wget命令。


$ curl -o example.html https://www.example.com

上面命令將www.example.com保存成example.html

-O

-O參數將服務器回應保存成文件,並將 URL 的最後部分當作文件名。


$ curl -O https://www.example.com/foo/bar.html

上面命令將服務器回應保存成文件,文件名為bar.html

-s

-s參數將不輸出錯誤和進度信息。


$ curl -s https://www.example.com

上面命令一旦發生錯誤,不會顯示錯誤信息。不發生錯誤的話,會正常顯示運行結果。

如果想讓 curl 不產生任何輸出,可以使用下面的命令。


$ curl -s -o /dev/null https://google.com

-S

-S參數指定只輸出錯誤信息,通常與-s一起使用。


$ curl -s -o /dev/null https://google.com

上面命令沒有任何輸出,除非發生錯誤。

-u

-u參數用來設置服務器認證的用戶名和密碼。


$ curl -u 'bob:12345' https://google.com/login

上面命令設置用戶名為bob,密碼為12345,然後將其轉為 HTTP 標頭Authorization: Basic Ym9iOjEyMzQ1

curl 能夠識別 URL 裡面的用戶名和密碼。


$ curl https://bob:[email protected]/login

上面命令能夠識別 URL 裡面的用戶名和密碼,將其轉為上個例子裡面的 HTTP 標頭。


$ curl -u 'bob' https://google.com/login

上面命令只設置了用戶名,執行後,curl 會提示用戶輸入密碼。

-v

-v參數輸出通信的整個過程,用於調試。


$ curl -v https://www.example.com

--trace參數也可以用於調試,還會輸出原始的二進制數據。


$ curl --trace - https://www.example.com

-x

-x參數指定 HTTP 請求的代理。


$ curl -x socks5://james:[email protected]:8080 https://www.example.com

上面命令指定 HTTP 請求通過myproxy.com:8080的 socks5 代理發出。

如果沒有指定代理協議,默認為 HTTP。


$ curl -x james:[email protected]:8080 https://www.example.com

上面命令中,請求的代理使用 HTTP 協議。

-X

-X參數指定 HTTP 請求的方法。


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

上面命令對https://www.example.com發出 POST 請求。

參考鏈接

(完)