如何使用 cURL 發布原始身體數據
一、概述
客戶端 URL ( cURL ) 是 Linux 中的命令行實用程序,它支持客戶端和服務器之間通過許多協議(包括 HTTP 和 HTTPS)進行數據交換。在本教程中,我們將學習如何使用 cURL 通過 POST 請求發送原始正文數據。
2.理解–data
和–data-raw
curl
命令支持–data
和–data-raw
選項以通過 POST 請求傳輸數據。在本節中,讓我們了解使用帶有這些選項的curl
的默認行為。
首先,我們需要一個服務器端點來接受來自我們作為客戶端的請求。因此,讓我們訪問webhook.site
並獲取服務器端點:
https://webhook.site/5610141b-bd31-4940-9a83-1db44ff2283e
現在,為了可重用性目的,讓我們使用此端點初始化變量website
:
$ website="https://webhook.site/5610141b-bd31-4940-9a83-1db44ff2283e"
接下來,讓我們使用帶有–data
和–data-raw
選項的curl
命令通過 POST 請求發送文本:
$ curl --data "simple_body" --trace-ascii website-data.log "$website"
$ curl --data-raw "simple_body" --trace-ascii website-data-raw.log "$website"
我們必須注意,我們使用了–trace-ascii
選項來跟踪請求並捕獲website-data.log
和website-data-raw.log
文件中的跟踪日誌。
繼續,讓我們通過對捕獲的跟踪日誌執行grep
來檢查Content-Type
標頭的值:
$ grep --max-count=1 Content-Type website-data-raw.log website-data.log
website-data-raw.log:0083: Content-Type: application/x-www-form-urlencoded
website-data.log:0083: Content-Type: application/x-www-form-urlencoded
我們可以推斷,即使我們沒有在原始請求中指定Content-Type
, curl
也會將其設置為默認值application/x-www-form-urlencoded
。結果,請求沒有將文本“simple_body”
作為原始數據發送,而是作為表單數據發送。
最後我們通過webhook.site
頁面直觀的確認一下:
我們可以注意到“ simple_body”
在Form values
部分作為一個空值的鍵出現。
3. 定義Content-Type
標頭
在本節中,我們將使用–header
選項顯式設置Content-Type
標頭,這樣curl
就不會成為默認選擇。
讓我們繼續使用相同的內容但使用正確的標頭髮出curl
請求:
$ curl --header "Content-Type: text/plain" --data "simple_body" --trace-ascii website-data.log "$website"
$ curl --header "Content-Type: text/plain" --data-raw "simple_body" --trace-ascii website-data-raw.log "$website"
接下來,讓我們檢查跟踪日誌以驗證請求標頭中的Content-Type
值:
$ grep --max-count=1 Content-Type website-data-raw.log website-data.log
website-data-raw.log:006f: Content-Type: text/plain
website-data.log:006f: Content-Type: text/plain
我們可以注意到Content-Type
標頭是正確的。此外,我們將看到我們使用帶有–max-count=1
的grep
將輸出結果限制為請求標頭。
最後,我們也通過訪問webhook.site
頁面來直觀地確認一下:
我們可以看到Raw content
部分中存在原始文本,而Form values
部分現在是空的。
4.從文件發送內容
有時,請求正文可能包含大量文本,建議我們直接從文件發送內容。
首先,讓我們將內容存儲在content.txt
文件中:
$ echo "simple_body" > content.txt
我們必須注意,為簡單起見,我們在文件中添加了短文本,同樣的方法適用於較大的文件。
接下來,我們需要了解**curl
支持使用@file
表示法使用–data
選項通過文件發送原始文本,但不支持使用–data-raw
選項**。因此,讓我們繼續使用帶有@file
符號的–data
選項發出curl
請求:
$ curl --header "Content-Type: plain/text" --data @content.txt --trace-ascii website-data.log "$website
此外,讓我們通過檢查請求正文的website-data.log
跟踪文件來驗證:
$ grep -B1 -i simple_body website-data.log
=> Send data, 11 bytes (0xb)
0000: simple_body
最後,讓我們也看看當我們使用帶有–data-raw
選項的@file
時會發生什麼:
$ curl --header "Content-Type: plain/text" --data-raw @content.txt --trace-ascii website-data-raw.log "$website"
$ grep -B1 -i content.txt website-data-raw.log
=> Send data, 12 bytes (0xc)
0000: @content.txt
我們可以注意到,這一次, curl
不理解它需要從content.txt
文件中獲取內容。相反,它發送文本“@content.txt”
作為請求正文。
5.結論
在本文中,我們學習瞭如何使用curl
命令通過 POST 請求發送原始正文內容。此外,我們還學習了使用文件發送大量內容。