ファイルアップロードを伴うWebAPIの設計パターンを比べる

こんにちは、スズキです。 ファイルアップロードを伴うWebAPIを開発する機会がぼちぼちあるのですが、ファイルアップロード周りの方式をどんな設計にするかを迷いがちなので、考えを整理してみました。

方式1:multipart/form-dataを使う

ファイルアップロードの基本、multipart/form-dataをAPIリクエストに使う方式です。
  • 単純なAPIならコマンドでも比較的ポンと気軽に送信できるのが魅力
  • JSONベースのシステムから送信するときにリクエストを別途組み立てないといけないのが面倒

こういうときに採用すると良さそう

  • テキストデータが少なくファイルのやり取りがメインのAPIをつくりたいとき
  • コマンドベースで使えるようなシンプルなAPIをつくりたいとき

方式2:JSON+Base64エンコードを使う

application/jsonをAPIリクエストに使う方式です。ファイル自体のデータもBase64エンコードしてJSONデータの中に含めてしまいます。
  • JSONベースのシステムからAPIを使いやすいのが魅力
  • ファイルのエンコード・デコードの処理時間が余分にかかるのと、Base64エンコードすることでファイルサイズが増えるので通信時間が増える

こういうときに採用すると良さそう

  • ファイルサイズが小さくテキストデータのやり取りがメインのAPIをつくりたいとき
  • リクエストもレスポンスもすべてJSONでやり取りできるAPIをつくりたいとき

方式3:multipart/form-dataとJSONを使い分ける

開発するAPI群のうち、ファイルアップロード用APIだけmultipart/form-dataを使い、その他のAPIにはapplication/jsonを使う方式です。ファイルアップロード用APIでファイルを特定するためのキーを発行し、その他のAPIではそのキーを使ってファイルを指定します。
  • JSONベースのシステムから使いやすく、アップロードしたファイルを他のAPIで何度も使いまわしやすいのが魅力
  • ファイルアップロードが個別のAPIなため、APIのリクエスト回数が増える

こういうときに採用すると良さそう

  • サイズの大きいファイルと複雑なテキストデータのどちらも取り扱うAPIをつくりたいとき
  • アップロードしたファイルを何度も使いまわせるAPIをつくりたいとき

以上、どちらかというと私の備忘録な投稿でした。