使用文件中的數據通過 cURL 發送發布請求的指南
一、概述
cURL是 Linux 中的命令行工具,用於通過多種受支持的協議(如 HTTP、HTTPS 和 FTP)發送和接收文件。
在本教程中,我們將學習如何使用文件中的數據通過 cURL 發送 POST 請求。
2. 基礎知識
cURL 支持通過 POST 請求從文件發送數據的多種方式。在本節中,讓我們對使用curl
命令處理文件數據有一個基本的了解。
首先,我們需要一個端點來接受來自客戶端的請求。因此,讓我們訪問[webhook.site](https://webhook.site/)
並使用地址初始化server_endpoint
變量:
server_endpoint="https://webhook.site/5610141b-bd31-4940-9a83-1db44ff2283e"
接下來,讓我們獲取一個示例 JSON 文件,並使用–data
選項發出curl
請求以發送其數據:
$ curl --header "Content-Type: application/json" \
> --data "$(cat ~/Downloads/sample1.json)" \
> --trace-ascii trace-json-data-request.log \
> $server_endpoint
我們必須注意,我們正在使用–trace-ascii
選項來跟踪 curl 請求,以便我們可以使用它來驗證請求。
或者,我們也可以使用@file
符號讓curl
在內部從文件中讀取數據:
$ curl --header "Content-Type: application/json" \
> --data "@~/Downloads/sample1.json" \
> --trace-ascii trace-json-data-request.log \
> $server_endpoint
最後,讓我們檢查trace-json-data-request.log
文件以驗證我們是否已成功發送數據:
$ grep --max-count=1 --after-context=2 "Send data" trace-json-data-request.log
=> Send data, 65 bytes (0x41)
0000: {. "fruit": "Apple",. "size": "Large",. "color": "Red".
0040: }
看起來我們做對了。
3. 發送帶有元數據的文件數據
通過 POST 請求發送文件數據的典型用例是當最終用戶填寫表單並將其提交給服務器時。因此,請求必須支持與文件數據一起發送其他元數據。為解決此類用例, curl
支持–form
選項以根據RFC-2388使用multipart/form-data
Content-Type
標頭髮布數據。
讓我們繼續,下載示例 gif 文件,並發送文件數據和一些用戶詳細信息:
$ curl --form '[email protected];type=image/gif' \
--form 'username=baeldung' \
--form 'user_id=123' \
--trace-ascii trace-form-request.log
$server_endpoint
接下來,讓我們檢查trace-form-request.log
文件並驗證請求是否已正確發送:
$ grep --max-count=3 \
--after-context=2 \
--before-context=1 \
-e 'username' -e 'user_id' -e 'gif' \
trace-form-request.log
006c: f"
0070: Content-Type: image/gif
0089:
008b: GIF89a.......................................................#..
--
6bb5: --------------------------b17d10ecc2112c14
6be1: Content-Disposition: form-data; name="username"
6c12:
6c14: baeldung
6c1e: --------------------------b17d10ecc2112c14
6c4a: Content-Disposition: form-data; name="user_id"
6c7a:
6c7c: 123
我們注意到curl
了解image/gif
Content-Type
並方便地將文件數據發送到服務器。此外,在grep
命令中使用–before-context
和–after-context
選項可以讓我們看到trace-form-request.log
文件中匹配行前後的內容。
最後,讓我們通過從webhook.site
頁面下載文件來驗證服務器端收到的文件:
我們可以看到Form values
部分包含username
和user_id
鍵及其值,而Files
部分包含sample.gif
文件。
但是,我們必須注意,使用這種方法不適用於 mp3、jpeg 等非文本文件。
4.發送多個文件
在本節中,我們將使用帶有–form
選項的curl
發送單個文件的方法擴展到多個文件。
讓我們下載兩個示例 mp3 文件並使用帶有–form
選項的curl
發布它們:
$ curl --form '[email protected];type=audio/mp3' \
--form '[email protected];type=audio/mp3' \
--trace-ascii trace-form-request-multi-files.log \
$server_endpoint
接下來,讓我們檢查trace-form-request-multi-files.log
文件並驗證請求是否按預期發送:
$ grep --max-count=6 --after-context=2 --before-context=1 -e 'mp3' trace-form-request-multi-files.log
002c: Content-Disposition: form-data; name="file1"; filename="sample1.
006c: mp3"
0072: Content-Type: audio/mp3
008b:
008d: ID3......#TSSE.......Lavf57.83.100.............P................
--
d25f: Content-Disposition: form-data; name="file2"; filename="sample2.
d29f: mp3"
d2a5: Content-Type: audio/mp3
d2be:
=> Send data, 65536 bytes (0x10000)
它看起來是正確的。
最後,我們訪問webhook.site
頁面,確認服務器是否成功接收文件:
我們可以注意到Files
部分包含sample1.mp3
和sample2.mp3
文件。
5.結論
在本文中,我們探討了使用 cURL 從文件發送數據的技術。此外,我們了解了用於解決用例的–data
和–form
選項。