问题
我正在尝试使用 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!