セミコロンで区切られた文字列をフォームデータとして渡すと、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!

おすすめ記事