1. 概述
Linux 中的客户端 URL(cURL)是一个命令行工具,支持通过多种协议(包括HTTP和HTTPS)在客户端与服务器之间进行数据交换。本教程将介绍如何使用cURL发送原始体数据到POST请求。
2. 理解–data
和–data-raw
cURL 命令提供了–data
和–data-raw
选项来通过POST请求传输数据。在本节中,我们将理解使用这些选项的默认行为。
首先,我们需要一个接受来自我们客户端请求的服务器端点。因此,让我们访问webhook.site并获取服务器端点:
https://webhook.site/5610141b-bd31-4940-9a83-1db44ff2283e
现在,为了重用目的,让我们初始化变量website
存储这个端点:
$ website="https://webhook.site/5610141b-bd31-4940-9a83-1db44ff2283e"
接下来,使用curl
命令,配合–data
和–data-raw
选项发送文本到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
(在Linux中的通用文本搜索)检查捕获的日志中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页面直观地确认这一点:
我们可以看到,在“Form values”部分,“simple_body”作为键带有空值出现。
3. 定义Content-Type
头
在这一节中,我们将使用–header
选项来明确设置Content-Type
头,这样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
头是正确的。此外,我们还使用了grep
配合–max-count=1
来限制输出结果到请求头部分。
最后,我们也通过访问webhook.site页面来确认这一点:
现在,原始文本出现在“Raw content”部分,而“Form values”部分为空。
4. 从文件发送内容
有时,请求体可能包含大量文本,建议直接从文件发送内容。
首先,我们将内容存储在content.txt
文件中:
$ echo "simple_body" > content.txt
我们需要注意,为了简单起见,我们在文件中添加了少量文本,对于较大的文件也适用同样的方法。
接着,需要了解的是,cURL 支持使用–data
选项并通过@file
符号从文件发送原始文本,但不适用于–data-raw
选项。现在,让我们使用–data
选项和@file
符号进行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
最后,让我们看看当使用@file
与–data-raw
选项时会发生什么:
$ 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请求中发送原始体数据。此外,我们还学会了如何使用文件发送大量内容。