ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

curl `-d, --data` 选项完全指南:HTTP POST 与 MQTT PUBLISH 数据发送全解析

curl `-d, --data` 选项完全指南:HTTP POST 与 MQTT PUBLISH 数据发送全解析 curl-d, --data选项完全指南HTTP POST 与 MQTT PUBLISH 数据发送全解析【免费下载链接】curlA command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, MQTTS, POP3, POP3S, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. libcurl offers a myriad of powerful features项目地址: https://gitcode.com/GitHub_Trending/cu/curl导读-d, --data data是 curl 命令行工具中最常用也最核心的数据发送选项之一它让 curl 以浏览器提交 HTML 表单的方式向 HTTP(S) 服务器发送 POST 请求同时也是 MQTT 场景下发布消息数据的方式。本文将围绕 curl 源码仓库中该选项的权威文档 docs/cmdline-opts/data.md 展开完整解读其语义、文件读取规则、多次追加时的拼接行为、与--data-raw/--data-binary/--data-urlencode等变体的取舍并结合命令行解析源码src/tool_getparam.c揭示其底层实现帮助你在日常接口调试、表单提交与自动化脚本中精确控制发送的数据内容。选项速览与适用范围--data的完整元数据记录于 docs/cmdline-opts/data.md 的文件头如下长选项--data短选项-d参数data帮助文本Post data适用协议ProtocolsHTTP MQTT互斥选项Mutexedform、head、upload-file即与-F/--form、-I/--head、-T/--upload-file在同一命令行中不可同时生效分类Categoryimportant http post upload mqtt添加版本Added4.0即自 curl 4.0 起就存在是最古老的选项之一多次使用行为Multiappend即同一命令行多次给出时按追加语义合并See-also--data-binary、--data-urlencode、--data-raw、--form三个官方示例奠定了本文讨论的基础curl -d namecurl $URL curl -d namecurl -d toolcmdline $URL curl -d filename $URL值得注意的是docs/cmdline-opts/目录下的每个.md文件并不是给普通用户阅读的独立说明而是 curl 手册页curl.1的源文件构建系统通过 scripts/managen 脚本按 docs/cmdline-opts/MANPAGE.md 中描述的格式把它们渲染为 nroff/man 文档。因此本文中针对--data的描述与你在man curl、curl --help中看到的内容同源。HTTP(S) 下的 POST 语义与表单提交一致对于 HTTP(S) 协议--data使用POST 方法发送数据其行为与用户填写完 HTML 表单后点击提交按钮时浏览器发出的请求完全一致数据被放入请求体request bodycurl 默认携带的 Content-Type 为application/x-www-form-urlencoded这正是浏览器标准表单的编码类型。因此下面这条命令curl -d namecurltoolcmdline https://example.com/submit在语义上等价于用户在表单中输入了namecurl与toolcmdline两个字段并提交。服务器端按标准表单解析方式即可读取字段。如果你需要改变 Content-Type可以借助-H/--header显式覆盖例如把数据当作纯文本或 JSON 处理# 以 text/plain 语义提交服务器不会按表单解析 curl -d hello world -H Content-Type: text/plain $URL # 以 JSON 语义提交配合字符串化的 JSON curl -d {name:curl} -H Content-Type: application/json $URL注意--data本身只负责「把字节原样放进请求体并声明默认编码」它不会为你转义或序列化 JSON请自行确保 payload 的格式正确。数据原样传递curl 不做任何“改善”原文档特别强调了一个容易被忽略的事实The data for this option is passed on to the server exactly as provided on the command line. curl does not convert, change or improve it. It is up to the user to provide the data in the correct form.即--data的参数会原样、逐字节传递给服务器curl 不会转换、修改或“优化”你的数据——URL 编码也好、字段分隔也好都需要使用者自己保证格式正确。这条约束解释了为什么 curl 家族还需要--data-urlencode替你编码与--data-binary保留换行等原始字节这两个变体。MQTT 场景数据以 PUBLISH 消息发送--data的 Protocols 元数据是HTTP MQTT这说明它同样适用于 MQTTMessage Queuing Telemetry Transport协议。在 MQTT 请求中主题topic由 URL 的路径部分给出--data携带的内容作为PUBLISH报文发布到该主题。# 向 MQTT broker 的 test/topic 主题发布一条消息 curl -d hello from curl mqtt://broker.example.com/test/topic这是 curl 在 docs/cmdline-opts/data.md 与 MQTT 支持实现位于 lib/mqtt.c之间的一条明确对应关系命令行给出的数据即发布内容。核心规则一前缀与从文件/标准输入读取数据如果--data的参数以字母开头那么之后的剩余部分被解释为文件名curl 将读取该文件的内容作为 POST 数据若后跟-则从**标准输入stdin**读取。# 从文件 foobar 读取数据并 POST curl --data foobar $URL # 从标准输入读取例如管道输入 echo namecurl | curl -d - $URL # 从 stdin 读取时也可省略为显式写法 cat payload.txt | curl -d - https://example.com/submit一个关键的处理细节是当--data从文件读取数据时回车符carriage returns、换行符newlines与空字节null bytes会被剥除详见下节源码分析。如果文件内容是跨多行的文本这些换行会被去掉拼接进请求体。如果不希望具有这种特殊含义改用--data-raw它会把当作普通字符处理见后文。核心规则二多次使用以自动拼接--data的 Multi 元数据为append若在同一条命令行中多次使用该选项或其追加类变体curl 会把各部分数据用符号连接合并为一个整体然后再发送。原文档给出了最直白的例子同时使用-d namedaniel -d skilllousy最终生成的请求体是namedanielskilllousycurl -d namedaniel -d skilllousy $URL # 等效于 curl -d namedanielskilllousy $URL这种写法让脚本可以通过多次-d逐步累积表单字段而不必手工拼接长字符串。它也是表单字段多、可读性优先时推荐的命令行组织方式。需要留意拼接规则对数据是「追加」因此文件读取-d file与其他字面量混用时同样按此规则连接。源码级实现命令行解析到请求体的完整链路选项表与统一分发curl 工具侧把所有命令行选项集中登记在 src/tool_getparam.c 的选项表中。与--data相关的登记项包括第 106 行{data, ARG_STRG, d, C_DATA}—— 注册长名--data、短名-d枚举C_DATA第 109 行{data-raw, ARG_STRG, , C_DATA_RAW}以及对应的--data-ascii、--data-binary、--data-urlencode、--json等条目。在参数分发逻辑中src/tool_getparam.cC_DATA、C_DATA_ASCII、C_DATA_BINARY、C_DATA_URLENCODE、C_JSON、C_DATA_RAW六个分支被统一汇聚到同一个处理函数set_data()。也就是说整个-d家族共享同一套「读取输入 → 预处理 → 追加合并」的基础逻辑差异只在预处理阶段。set_data()的分支处理set_data()src/tool_getparam.c的核心逻辑可以概括为三路分支--data-urlencode专用路径先调用data_urlencode()完成 URL 编码再进入合并逻辑以开头且不是--data-raw跳过后若剩余为-则使用stdin否则以二进制只读方式curlx_fopen(name, rb)打开文件读取。这里有一个重要的内部差异对于普通--datafile2string路径读取后按 C 字符串处理因此换行、回车、空字节会被剔除对于--data-binary与--jsonfile2memory路径读取的是原始字节并记录长度不做任何清洗这正是--data-binary能携带任意二进制内容的原理如果文件内容为空set_data()会补一个空字符串确保仍然以 POST 形式发起请求其余普通参数直接作为字符串存入允许空白。追加合并与的来源config-postdata是一个动态增长的缓冲区在 src/tool_cfgable.c 中通过curlx_dyn_init(config-postdata, MAX_FILE2MEMORY)初始化。在set_data()尾部可以看到追加语义的实现src/tool_getparam.c若缓冲区中已有数据就先用curlx_dyn_addn(config-postdata, , 1)追加一个字符再写入本次数据——这就是「多次-d之间以连接」的代码出处。注意--json被排除在追加之外避免破坏 JSON 语法。进入 libcurl 请求合并完成的postdata最终通过 libcurl 的CURLOPT_POSTFIELDS/CURLOPT_POSTFIELDSIZE_LARGE选项挂到 easy handle 上这一点可以从--libcurl代码生成映射文件 src/config2setopts.c 中得到印证它会把命令行配置翻译为对应的curl_easy_setopt(curl, CURLOPT_POSTFIELDS, ...)调用。到这一步--data的字节流才真正成为 HTTP POST 请求体或 MQTT PUBLISH 报文。变体辨析--data-raw/--data-binary/--data-urlencodecurl 围绕--data提供了一组语义微调的变体。下表汇总了各自差异依据各选项独立文档 data.md、data-raw.md、data-binary.md、data-urlencode.md选项与--data的关系特殊解释内容处理--data/-d基准选项是file、-读文件/标准输入从文件读取时剥除回车、换行与空字节默认 Content-Typeapplication/x-www-form-urlencoded--data-ascii老式别名行为与--data完全一致是同上7.2 加入--data-raw几乎相同否按普通字符处理即使内容是atat也不会去读文件7.43.0 加入--data-binary二进制版本是换行/回车保留不做任何转换文件内容按原始字节发送7.2 加入如需服务器按二进制处理可加-H Content-Type: application/octet-stream--data-urlencode编码版本是先对内容做 URL 编码再发送7.18.0 加入用于替代手工转义表单字段对应地在 src/tool_getparam.c 的实现中C_DATA_RAW是唯一一个跳过分支的选项——它直接走「普通字符串」路径因此失去特殊含义C_DATA_BINARY以及C_JSON在读取文件时走二进制保真路径C_DATA_URLENCODE先经data_urlencode()编码。需要 URL 编码时使用--data-urlencode当字段值包含空格、中文、、等需要在 URL 编码层面转义的字符时应优先使用--data-urlencode。它支持五种语法详见># 名值对编码name 视为已编码value 被编码 curl --data-urlencode nameDaniel Stenberg $URL # 只编码内容不带 name curl --data-urlencode content with spaces $URL # 从文件编码内容含换行也会被编码 curl --data-urlencode namefile.txt $URL # 仅文件编码 curl --data-urlencode fileonly.txt $URL # stdin 作为文件来源 echo some data | curl --data-urlencode - $URL在--data-urlencode的语法匹配中若 content 部分本身含有或会与其它语法规则产生歧义文档建议谨慎避免或改用前两条以开头的无 name 形式。二进制保真选--data-binary如果数据中含有换行符、回车符、空字节等必须逐字节保真的二进制内容应当使用--data-binary# 原样发送图片等二进制文件注意 前缀 curl --data-binary photo.jpg $URL # 从 stdin 读取并原样发送 cat binary.bin | curl --data-binary - $URL # 如希望服务器按任意二进制处理显式指定 octet-stream curl --data-binary photo.jpg -H Content-Type: application/octet-stream $URL--data-binary的默认 Content-Type 与--data一致application/x-www-form-urlencoded因此文档建议在传输二进制内容时用-H覆盖为application/octet-stream。纯字面量选--data-raw当你需要发送以开头、含的普通文本如邮件地址、AT 命令、路径而不希望 curl 尝试打开文件时# 不会去读文件 atatat而是原样 POST 该字符串 curl --data-raw atat $URL # 与上述完全等价的另一写法 curl --data-raw hello $URL与其它选项的互斥关系--data与三个选项互斥元数据Mutexed: form head upload-file即在一个命令行中它和以下选项的语义冲突-F, --formmultipart/form-data 表单见 form.md-F走的是 MIME/multipart 编码路径与application/x-www-form-urlencoded的普通 POST 相互排斥-I, --headHEAD 方法不携带请求体-T, --upload-filePUT/上传语义与 POST 冲突。当普通-d数据、file读取与这些选项混用时以参数解析阶段实际生效的请求类型为准——使用--data意味着请求会被置为 POST 语义。常见实践与避坑清单提交表单字段多个字段分多条-d写由 curl 自动以连接可读性与可维护性最好curl -d namecurl -d toolcmdline -d version$(curl --version | head -1) $URLPOST 空数据-d 也能发起一个空请求体的 POST文件为空时 curl 同样会保证 POST 仍被发送见set_data()中对空文件补的逻辑。不要指望 curl 帮你编码--data是“所见即所得”的传输需要 URL 编码请显式用--data-urlencode需要二进制保真请用--data-binary需要字面请用--data-raw。注意 Shell 引号参数中含空格、、$等字符时务必加引号避免被 Shell 提前解释或拆分成多条参数。确认方法-d会自动把请求切换为 POST若想观察实际发出的请求含 Content-Type 与请求体可配合curl -v查看输出或使用--trace-ascii -查看完整字节流。文档同源本文所有语义均可在 docs/cmdline-opts/data.md 及其变体文档中交叉验证命令行解析与合并行为可对照 src/tool_getparam.c 的set_data()实现。小结-d, --data是 curl 在 HTTP(S) 上发起标准表单式 POST、在 MQTT 上发布 PUBLISH 消息的入口选项核心行为可以归纳为三点以application/x-www-form-urlencoded语义发送、多次使用以自动拼接、前缀触发文件/标准输入读取并从文件数据中剥除换行、回车与空字节。理解了这些规则后再结合--data-raw关闭解释、--data-binary二进制保真与--data-urlencode自动 URL 编码三个变体你就能在任何需要“向服务器发送数据”的 curl 场景中精确控制请求体的每一字节。【免费下载链接】curlA command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, MQTTS, POP3, POP3S, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. libcurl offers a myriad of powerful features项目地址: https://gitcode.com/GitHub_Trending/cu/curl创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表