URLSearchParams
を使ってみたら、けっこう便利でした。
URLSearchParams
とは
URLSearchParams
は、URLのクエリ文字列を生成するための、JavaScriptにあるオブジェクトです。死に体なIE11を除けば、サポートの続くブラウザでほぼ利用可能です(Can I use)。
何が便利か
何も使わずにクエリ文字列を組み立てようとすれば、ループを回しつつエスケープをかけたりなど、各種の作業が必要となります。URLSearchParams
は、そういった作業を全部担ってくれるので、中身のデータを作るのに専念できます。
また、HTTPリクエストを投げる際に、application/x-www-form-urlencoded
はmultipart/form-data
よりデータがコンパクトになりますので、その点でも有利です。
生成する
new URLSearchParams
で生成できますが、コンストラクタに渡せる引数のパターンがいくつもあります。
- 引数なしで、クエリのない状態のオブジェクトを作る
- クエリ文字列を与えて、それを解析してオブジェクトに起こす
-
[['キー1', '値1'], ['キー2', '値2']…]
のような、キーと値のペアの配列を渡す -
{'キー': '値'}
形式のオブジェクトを渡す
なお、URLSearchParams
は同じキーを複数入れることができますが、オブジェクト形式では同じキーを複数渡せませんので要注意です。
編集する
出来上がったURLSearchParams
オブジェクトに対して、append
でキー・値のペアを追加する、delete
で削除する、set
でキー・値のペアを設定する、forEach
やfor-of
でループを回すなどが可能です。
なお、「既存のクエリをURLSearchParams
でパースして、必要な部分を書き換える」ような応用であれば別ですが、そうでないなら「配列やオブジェクトとしてデータを整えた上で、最後にnew URLSearchParams
へ投げ込む」ほうがやりやすいかもしれません。
出力する
URLSearchParams
の結果を得たい場合、大きく2つの方法が考えられます。
-
toString()
でクエリ文字列にする。なお、文字列 + オブジェクト
のような連結演算や、`${オブジェクト}`
のような式展開を行うと、自動でtoString()
が行われますので、自分から書かなくて構わない場合もあります。 -
URLSearchParams
オブジェクトをそのままXMLHTTPRequest
やfetch
に渡して、POST
などのリクエストボディに組み込む。なお、URLSearchParams
を使う場合、リクエストのContent-Type
はapplication/x-www-form-urlencoded
であることが明らかですので、自分でヘッダを書く必要もなくなって楽です。
応用編
<form>
の値をクエリ文字列に起こしたい場合、FormData
に「フォームから値を拾う」機能がありますので、new URLSearchParams([...new FormData(formElement)])
のように、「FormData
をspreadして配列にしてからURLSearchParams
に入れる」という形で実行可能です(もちろん、<input type="file">
がないのが前提です)。