你有沒有遇過這種情況:寫好了一支 API,想快速測試一下有沒有正常運作,卻不想花時間打開 Postman 或寫一段測試程式?
其實,你的終端機裡就內建了一個超強大的工具——cURL。
這篇文章會帶你從最基本的用法開始,一步步學會用 cURL 來發送 HTTP 請求、測試 REST API,甚至透過 FTP 上傳下載檔案。
不需要任何前置知識,只要你會打開終端機,就能跟著做。
cURL 是什麼?
cURL 是一個 命令行介面(Command-line Interface, CLI),用來在終端機裡傳送資料到伺服器,或從伺服器取得資料。
你可以把它想像成一個「沒有畫面的瀏覽器」——瀏覽器做的事情(發送請求、接收回應),cURL 都能做,只是結果顯示在終端機裡而已。
cURL 支援的協定(protocol)非常多,包括 HTTP、HTTPS、FTP、IMAP、POP3、SMTP 等等。
不過在實務上,最常用的還是 HTTP 和 FTP,這篇文章也會聚焦在這兩個協定上。
環境準備:確認你的電腦有 cURL
在開始之前,先確認你的電腦能不能使用 cURL。
macOS 和 Linux 的使用者通常不用擔心,現代版本的系統都已經內建了 cURL。
Windows 的使用者,推薦安裝 Git Bash(可以到 git-scm.com 下載)。
Git Bash 不只提供 cURL,還附帶了一整套 Unix 指令,而且比 Windows 內建的命令提示字元或 PowerShell 好用很多。
安裝完成後,打開終端機輸入以下指令,確認 cURL 可以正常使用:
curl --help如果看到一大串選項說明,就代表安裝成功了。
用 cURL 發送第一個 GET 請求
我們會用一個免費的假 API 來練習,叫做 JSONPlaceholder。
這個網站提供了幾組測試資料,像是 posts(文章)、comments(留言)、users(使用者)等等,非常適合拿來練手。
取得所有文章
最簡單的用法,就是直接在 curl 後面接上網址:
curl https://jsonplaceholder.typicode.com/posts執行後,終端機會顯示 100 篇文章的 JSON 資料。
取得單篇文章
如果只想取得某一篇文章,在網址後面加上 ID 就好:
curl https://jsonplaceholder.typicode.com/posts/3這樣就會拿到 ID 為 3 的那篇文章。
查看 HTTP 回應標頭(Header)
有時候我們不只想看回應的內容,還想看伺服器回傳了哪些標頭資訊。
什麼時候會需要看標頭?舉幾個常見的情境:
- 確認回應格式:透過
Content-Type確認伺服器回傳的是 JSON、HTML 還是純文字,避免前端解析錯誤。 - 除錯快取問題:透過
Cache-Control或ETag確認資料有沒有被快取住,排查「明明改了資料但前端還是顯示舊的」這類問題。 - 檢查跨域設定:透過
Access-Control-Allow-Origin確認 CORS 有沒有設定正確,這在前後端分離的架構中很常遇到。 - 追蹤重新導向:透過
Location標頭確認伺服器把你導向了哪個網址。
同時顯示標頭和內容
使用小寫的 -i 旗標:
curl -i https://jsonplaceholder.typicode.com/posts/3
# 長版寫法:
curl --include https://jsonplaceholder.typicode.com/posts/3執行後,你會看到標頭資訊出現在最上面,接著才是 JSON 內容。
標頭裡包含了像是 content-type: application/json(告訴你回應格式是 JSON)、content-length(資料長度)等實用資訊。
只顯示標頭
如果你只想看標頭、不需要內容,可以用大寫的 -I 旗標:
curl -I https://jsonplaceholder.typicode.com/posts/3
# 長版寫法:
curl --head https://jsonplaceholder.typicode.com/posts/3小提示:cURL 的大部分選項都有「短版」和「長版」兩種寫法。
例如 -I 等同於 --head,效果一模一樣。
把回應內容存成檔案
如果你想把 API 回傳的資料儲存下來,而不是只顯示在螢幕上,cURL 也能辦到。
指定檔案名稱儲存
使用小寫的 -o(或 --output),後面接你想要的檔名:
curl -o test.txt https://jsonplaceholder.typicode.com/posts
# 長版寫法:
curl --output test.txt https://jsonplaceholder.typicode.com/posts執行後,所有文章資料就會被存到 test.txt 裡面。
檔案會儲存在你「目前所在的資料夾」,也就是你執行指令時終端機所在的路徑。
如果不確定自己在哪個資料夾,可以輸入 pwd 來查看目前的路徑。
你可以用 cat test.txt 來確認內容有沒有正確寫入。
用原始檔名儲存
如果你不想自己取名,可以用大寫的 -O,cURL 會自動用網址最後一段當作檔名:
curl -O https://jsonplaceholder.typicode.com/posts
# 長版寫法:
curl --remote-name https://jsonplaceholder.typicode.com/posts這樣就會產生一個叫做 posts 的檔案(沒有副檔名)。
用 cURL 下載檔案
cURL 不只能抓 API 資料,也能下載圖片或其他檔案。
下載圖片
假設你有一張圖片的網址,直接用 -O 就能下載:
curl -O https://example.com/image.png
# 長版寫法:
curl --remote-name https://example.com/image.png執行完畢後,你的目錄下就會多出 image.png 這個檔案。
限制下載速度
如果你想限制傳輸速率(例如避免佔滿頻寬),可以加上 --limit-rate:
curl --limit-rate 1000B -O https://example.com/image.png這裡的 1000B 代表每秒最多傳輸 1000 bytes。
用 cURL 發送 POST 請求(新增資料)
除了 GET 請求,cURL 也能發送 POST、PUT、DELETE 等其他類型的請求,這在測試 REST API 時非常實用。
發送 POST 請求
使用 -d(或 --data)旗標來帶上要傳送的資料:
curl -d "title=hello&body=hello world" https://jsonplaceholder.typicode.com/posts
# 長版寫法:
curl --data "title=hello&body=hello world" https://jsonplaceholder.typicode.com/posts拆解一下這段指令:
-d 後面接的是你要傳送給伺服器的資料。
資料的格式是 key=value,就像在填表單一樣——左邊是欄位名稱,右邊是你要填的值。
如果有多個欄位,就用 & 把它們串在一起,例如 title=hello&body=hello world 就是同時送出 title 和 body 兩個欄位。
另外有一點很方便:當你使用 -d 時,cURL 會自動判斷這是一個 POST 請求,所以你不需要額外加 -X POST。
執行後,伺服器會回傳一個 JSON 物件,長這樣:
{
"title": "hello",
"body": "hello world",
"id": 101
}id: 101 是伺服器自動產生的,因為 JSONPlaceholder 原本已經有 100 筆文章,新增的下一筆自然就是 101。
用 cURL 發送 PUT 請求(更新資料)
PUT 請求用來更新整筆資料。
前面提到,使用 -d 時 cURL 會自動幫你設定為 POST 請求。
但如果你想發的不是 POST,而是 PUT,cURL 就沒辦法自動判斷了。
你必須用 -X PUT 明確告訴它「我要發的是 PUT 請求」。
-X 是 --request 的縮寫,意思是「指定請求方法」。
指定完方法後,再搭配 -d 帶上你要更新的資料:
curl -X PUT -d "title=hello" https://jsonplaceholder.typicode.com/posts/3
# 長版寫法:
curl --request PUT --data "title=hello" https://jsonplaceholder.typicode.com/posts/3這段指令的意思是:把 ID 為 3 的文章,標題更新為 “hello”。
伺服器回傳的結果會顯示 id: 3 且 title 已經被改成 “hello”。
用 cURL 發送 DELETE 請求(刪除資料)
DELETE 請求更單純,不需要帶資料,只要指定方法和目標網址就好:
curl -X DELETE https://jsonplaceholder.typicode.com/posts/3
# 長版寫法:
curl --request DELETE https://jsonplaceholder.typicode.com/posts/3成功的話,伺服器會回傳一個空物件 {},代表刪除操作已完成。
處理需要驗證的 API
如果 API 需要帳號密碼才能存取(例如 Basic Authentication),可以用 -u 旗標:
curl -u username:password https://api.example.com/protected
# 長版寫法:
curl --user username:password https://api.example.com/protected-u 後面的格式是 帳號:密碼,cURL 會自動幫你處理認證的部分。
處理網址重新導向
有些網址會自動重新導向(redirect)到另一個網址。
例如,輸入 http://google.com 會被導向到 http://www.google.com。
如果你直接用 cURL 請求原始網址,只會看到一個「301 Moved」的回應:
curl http://google.com
# 回應:301 Moved,文件已搬到 www.google.com要讓 cURL 自動跟隨重新導向,加上 -L 旗標就好:
curl -L http://google.com
# 長版寫法:
curl --location http://google.com這樣 cURL 就會自動跟著跳轉,取得最終頁面的內容。
用 cURL 透過 FTP 上傳與下載檔案
cURL 除了 HTTP,也支援 FTP(檔案傳輸協定)。
如果你有 FTP 伺服器的帳號,就能直接用 cURL 上傳和下載檔案。
上傳檔案到 FTP 伺服器
使用 -T 旗標指定要上傳的檔案,搭配 -u 提供 FTP 帳密:
curl -u user@example.com:password -T hello.txt ftp://ftp.example.com/
# 長版寫法:
curl --user user@example.com:password --upload-file hello.txt ftp://ftp.example.com/執行成功後,hello.txt 就會出現在 FTP 伺服器上。
從 FTP 伺服器下載檔案
把 -T 換成 -O,然後在網址後面指定檔案名稱:
curl -u user@example.com:password -O ftp://ftp.example.com/hello.txt
# 長版寫法:
curl --user user@example.com:password --remote-name ftp://ftp.example.com/hello.txt檔案就會被下載到你目前的目錄下。
cURL 常用旗標速查表
小結
這篇文章涵蓋了 cURL 最常用的功能,快速回顧一下你學到了什麼:
- cURL 是一個命令行介面工具,用來在終端機裡傳送和接收資料。
- 用
curl <網址>就能發送最基本的 GET 請求。 -i和-I可以查看回應的標頭資訊。-o和-O可以把回應存成檔案。-d可以發送 POST 請求並帶上資料。-X可以指定任何 HTTP 方法(PUT、DELETE 等)。-u可以處理需要帳號密碼的 API。-L可以自動跟隨重新導向。- cURL 也支援 FTP 協定,能用
-T上傳、-O下載檔案。
cURL 的功能遠不止這些,但掌握了這些基礎操作,你已經足以應付大部分的 API 測試和檔案傳輸需求了。
下次寫好 API 想快速測試時,不妨打開終端機試試看吧!