TL;DR
- プロダクトごとに統一できると嬉しい
- 筆者的には
multipart/form-data
がおすすめ- しかし、バックエンド側のパース処理が複雑になるケースがあるのでその場合は、
x-www-form-urlencoded
がおすすめ
- しかし、バックエンド側のパース処理が複雑になるケースがあるのでその場合は、
POST、PUTメソッドのペイロードでよく使われるContent-Type
-
application/json
- レスポンスのContent-Typeでは、おそらくこれが一番多いんじゃないか
- JavaScriptで処理する場合はとても楽
- しかし、TypeScriptでは型定義しないと危ないので他と比べるとコストが大きい気がする
- 画像などのバイナリファイルをこれで送信するのは「技術的には可能」だが現実的ではない
-
x-www-form-urlencoded
-
hoge=123&huga=aaa
のようなURLクエリパラメータをペイロードに入れたような形式 - 基本的には、format stringで組み立てるのはインジェクションされる可能性があり危険なので
encodeURIComponent()
で値をエンコードしてあげる必要がある-
encodeURI()
という関数も存在するが違いはMDNを参照するとわかりやすい -
URLSearchParams()
を使うと.set()
メソッドが使えて簡単にクエリパラメータを組み立てられて便利1 -
URLSearchParams()
の引数にFromDataを入れると変換が可能- しかし、FromDataにファイルが入っている場合うまく変換できないためTypeScriptでは
URLSearchParams()
の仮引数にFormDataを渡せない2- この場合、FromData内にファイルが存在しないことが確定しているのであれば
URLSearchParams(from as any)
にしてしまってもRuntimeエラーは発生しない
- この場合、FromData内にファイルが存在しないことが確定しているのであれば
- しかし、FromDataにファイルが入っている場合うまく変換できないためTypeScriptでは
-
-
-
multipart/from-data
-
FromData
クラスがあるのでJavaScriptからは楽に送信できる - しかし、JS以外からは結構大変3なので避けられがち?
- 外部APIとかでこれは見たこと無い
- ファイルを送信する場合、これ一択な気がする
-
-
application/graphql
- GraphQLを使う場合のContent-Type
- 特筆することは無い
筆者のおすすめ
multipart/form-data
が個人的には大好きです。以下のようにfetch
のdata
に渡すだけで使えます。
const from = new FromData();
from.append('key', 'value');
form.append('image', image);
const res = await fetch('/api', {
method: 'POST',
data: form
});
バックエンド側では、Goを使えばr.FormFile("file")
のように簡単に取得できるので便利です。デメリットとしては、x-www-form-urlencoded
などと比べるとペイロードのデータ量が比較的大きいのが挙げられます。
文字列だけの場合はx-www-form-urlencoded
にして、画像のアップロードなどはmultipart/form-data
にするというのも良いかもしれません。
また、OIDCのGETでもPOSTでもどちらでも使用可能なAPIエンドポイント4などを実装する場合はx-www-form-urlencoded
が必須になるのかなと思います。
-
Form で submit されたデータの収集と FormData & URLSearchParams | blog.jxck.io ↩
-
allow constructing URLSearchParams directly from FormData · Issue #30584 · microsoft/TypeScript ↩
-
Goなどはmultipart package - mime/multipart - Go Packagesパッケージなどがあり、こういうので組み立てると良い。 ↩
-
Final: OpenID Connect Core 1.0 incorporating errata set 1などは
Authorization Servers MUST support the use of the HTTP GET and POST methods defined in RFC 2616 [RFC2616] at the Authorization Endpoint.
とあるようにGETとPOSTメソッドで実装しなければいけない。 ↩