将分号分隔的字符串作为表单数据传递时,cURL“[跳过]未知表单字段”

将分号分隔的字符串作为表单数据传递时,cURL“[跳过]未知表单字段”

问题

我正在尝试使用 cURL 将表单数据发布到 API。API 的文档声明它接受multipart/form-data内容类型。

由于这是脚本的一部分,我正在尝试构建一个以分号分隔的表单字段字符串,该字符串已记录在案在 cURL 的文档中

我尝试过的

我会做什么喜欢能够执行的操作(为了根据传递给脚本的参数轻松构建此字符串)是:

local _payload="file=@file;username=name;content=hello"
echo "INFO payload: ${_payload}"
curl -i -F "${_payload}" "${url}"

$ ./myscript.sh <args>
# INFO payload: file=@file;username=name;content=hello  -- my script
# Warning: skip unknown form field: username=name       -- cURL
# Warning: skip unknown form field: content=hello       -- cURL

我从 cURL 收到这些警告,并且正如预期的那样,API 永远不会获取这些值。

什么工作是将每个字段作为自己的参数传递给 cURL,即

curl -i -F "file=@file" -F "username=name" -F "content=hello" "${url}"

...但这不太适合以编程方式解释。

我应该编辑指出,在这两种情况下,文件都会被正确接收和处理。

问题

我确信这是我所缺少的东西,但在仔细研究了 cURL 的文档和我请求的 API 后,我找不到它。为什么 cURL 会跳过这些表单字段,我该如何预防/修复它?

答案1

我已经取得了突破,当然是在我将第一个问题发布到 Unix.SE 之后。我重新阅读了文档并意识到(不知何故第一次)我不正确地使用了分号分隔的字符串。

文档声明分号不是用来分隔多个字段的,而是用来分隔同一字段的多个品质的。这就是我出错的地方。

API 文档声明端点接受 url 编码的 JSON 负载作为payload_json字段,所以我改为这样做:

local _json="payload_json=$(build_json)"  # defined elsewhere
local _file="file=@file"
curl -i -F "${_file}" -F "${_json}" "${url}"

你看,它有效。 RTFD!

相关内容