![将分号分隔的字符串作为表单数据传递时,cURL“[跳过]未知表单字段”](https://linux22.com/image/138797/%E5%B0%86%E5%88%86%E5%8F%B7%E5%88%86%E9%9A%94%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%BD%9C%E4%B8%BA%E8%A1%A8%E5%8D%95%E6%95%B0%E6%8D%AE%E4%BC%A0%E9%80%92%E6%97%B6%EF%BC%8CcURL%E2%80%9C%5B%E8%B7%B3%E8%BF%87%5D%E6%9C%AA%E7%9F%A5%E8%A1%A8%E5%8D%95%E5%AD%97%E6%AE%B5%E2%80%9D.png)
问题
我正在尝试使用 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!