multipart/form-data cURLオプションの指定方法

外部のWebサービスやAPIと連携するときに、Claris FileMaker では「URL から挿入」スクリプトステップを使用します。
また、そのときに単純なWebアクセスではないほとんどの場合で、cURLオプションを設定します。

今回は、Content-Type として multipart/form-data でリクエストするときの、cURLオプションについてヘルプには書かれていない補足説明をしたいと思います。

まず初めに「multipart/form-data とは?」を説明した後に、以下の流れで解説していきたいと思います。
・画像を送信するときの cURLオプション
・”@”で始まるテキストを送信するときの cURLオプション
・”@”で始まるテキストを変数に格納して送信するときの cURLオプション

multipart/form-data とは?

multipart/form-data はフォームデータをサーバーに送る際に用いられる Content-Type の一つです。特にファイルや大量のデータを扱う際によく使われ、主にファイルアップロードを含むフォームでよく使われます。

multipart/form-data を使用する際は、リクエストヘッダに --header "Content-Type:multipart/form-data" と指定する必要があります。
しかし、cURL オプション --form または -F を使用すると、自動的に Content-Type を multipart/form-data に設定してくれます。
そのため、API仕様で求められていても、cURLオプションではあえて記述しないのがスタンダードになっています。

画像を送信するときの cURLオプション

画像を送信する場合、直接画像自体をcURLオプションに指定することはできません。代わりに、画像を変数に格納し、その変数を指定する必要があります。

変数$image に画像を入れます。
Claris FileMaker では変数に入れた画像を cURLオプション で指定する場合、@に変数を続けて書きます。

--form "image=@$image"

リクエストの中身を見てみると、filename="image"  Content-Type: image/jpeg が付与されており、jpeg形式で画像が送信されていることが確認できます。

この場合では、$変数名 がアップロードするファイルの名前として送信されます。今回は $image としましたが、 ファイル名が ABC.pdf だった場合は、$ABC.pdf にするとよいかもしれません。

ちなみに、Content-Type が application/json の場合は、リクエストボディに変数を指定するには、cURL オプション --data  または -d を使用して、以下のように指定します。

--data @$body

“@”で始まるテキストを送信するときの cURLオプション

テキストは、変数に入れずに直接 cURLオプション に指定することができます。
以下の例では、nameというキーに対して ito というテキストを割り当てています。

--form "name=ito"

しかし、@ から始まるテキストを割り当てる場合は、エラーになってしまいます。
以下の例では、machineId= に続けて @ から始まるテキストをそのまま指定した場合です。

--form "machineId=@SS01TN92381|WEIfJQop5kRfnZxGyQk66ZjhUVslSx8l"


リクエスト内容を確認したところ、 machineId というキーそのものがありませんでした。
multipart/form-data では、値の1文字目が @ の場合、おそらく、その次に $変数 が続くと期待されます。
しかし、その変数がない場合、リクエストに含まれない動きになるようです。

@から始まるテキストを割り当てるには、cURL オプション --form ではなく --form-string を指定する必要があります。

--form-string "machineId=@SS01TN92381|WEIfJQop5kRfnZxGyQk66ZjhUVslSx8l"

今度はリクエストにきちんと machineId が入っていることが確認できました。

ちなみに、この cURL オプション --form-string  は、Claris FileMaker の標準マニュアルには記載されていますが、詳しい内容については記載されていませんでした。

“@”で始まるテキストを変数に格納して送信するときの cURLオプション

では、先程の@を含むテキストを $machineId 変数に入れて、以下のように cURLオプション に指定してみました。

--form "machineId=@$machineId"

上記の指定方法では、Content-Type: text/plain の行が追加され、$machineId に入れたテキストではなく、$machineId に入れたテキストをファイルとして送信されてしまいました。

変数をファイルとして送信させずに中身だけをテキストで渡したい場合は、@の代わりに< を使用します。
これは Claris FileMaker のヘルプには書かれていませんが、実際使用している libcurl ライブラリのヘルプには記載されていますので、正式な方法なのかは不明です。

--form  "machineId=<$machineId"

リクエストを見ると、 Content-Type: text/plain の行は無くなっており、変数の値であるテキストを渡せていることが確認できます。

まとめ

この記事で紹介した cURLオプション の指定方法を表でまとめると、以下のようになります。

【 余談 】
最近、以下のリンク先へのアクセスを増やしたいと考えており、流入量が多いほどブログの価値が向上するため、ますます投稿を加速させていきたいと思います。
リンク先を開いていただけると大変助かります。
Claris International Inc. (日本語)
ご協力いただけましたら幸いです。