ビューティフルWebコード

美しいWebサイトのコーディングについて説明をしていきます。

URL設計 パラメータにQueryStringを使うか、URLに含めるのか

設計パターン

user情報を表示する画面のURL設計をする場合以下の二通りに分けられるのではないでしょうか

  1. /user?id=12345(QueryString)
  2. /user/12345(URLに含める)

どちらが優れてるのか?と言われると、どちらが優れてることはないと思います。

以下のことができれば、どちらでもいいですよね。

  • きちんとControllerのActionメソッドにルーティングされること
  • パラメータを取得できること
  • パラメータのバリデーションを共通ルールで行えること

あとは、設計者の好みの問題も大きいと思います。

大事なのは、きちんと利用するMVCフレームワークについて、上記を可能にする手段が提供されているかを確認する必要が有ります。

  • QueryStringの場合

どのフレームワークでも対応可能と思います。

  • URLに含める場合

きちんとルーティングができるかを確認しておく必要が有ります。調査に時間がかかったり、要件を満たせなくなることは避けたほうがいいです。

QueryStringを使うべきURL QueryStringを使うべきではないURL

階層構造をもつ場合はQueryStringを使わないURL

WindowsエクスプローラMacだとFinder)のディレクトリ階層みたいな感じですね。
例1 日付

  • /schedule/2010 2010年のスケジュール一覧
  • /schedule/2010/01 2010年1月のスケジュール一覧
  • /schedule/2010/01/15 2010年1月15日のスケジュール一覧

これをqueryStringで表すと

/schedule?y=2010&m=01&d=15

QueryStringは順番を入れ替えたり、パラメータを含める、含めないを可変に行えるので、次のようなアクセスもできてしまいます。

/schedule?d=15

dがあるときはy,mは必須
mがあるときはyは必須
という複雑なバリデーションを求められます。

パラメータの項目が可変になる場合はQueryStringを使ったURL

主に検索などです。
ユーザに利用してもらう検索については、テキストボックスが一つしかないgoolgeのような検索が使い易いですが、業務システムやCMS(コンテンツ管理システム)のように社内で利用されるシステムの検索などは検索条件を複雑に指定できるように、複数の inputを配置することが多いです。この場合はやはり、QueryStringになります。

例 在庫検索(品名、品番、カテゴリ、、、)

  • /stock/search?pnm=xxx&pcd=xxx&pca=xxxx

検索条件の場合、一般的な仕様として

  • パラメータを含めれば検索条件に含める
  • パラメータを含めなければ検索条件に含まれない

という組み合わせが存在します。パラメータをURLに含める形式の場合これらは実現できません。

また、フレームワークによってはパラメータを一つのModelObjectとしてActionメソッドに渡すことができ、Model内部でバリデーションを行い、Actionに渡ったときにはバリデーション結果が分かっているという機能を持つものも多いです。
複雑な入力が行われる画面についてはQueryStringをお勧めします。