1. ホーム
  2. http

[解決済み] URLマトリックスパラメータとクエリパラメータの比較

2022-04-15 20:29:19

質問

URLにマトリックスとクエリパラメータのどちらを使用するか悩んでいます。古い ディスカッション に、そのトピックは納得がいきません。

一見すると、matrix paramsには利点しかないように見えます。

  • より読みやすい
  • XML文書内の"&"のエンコードおよびデコードが不要になります。
  • URLに"?"を含むものは多くの場合キャッシュされず、行列パラメータを含むURLはキャッシュされる
  • 行列パラメータはパスのどこにでも現れることができ、パスの末尾に限定されることはありません。
  • 行列パラメータは複数の値を持つことができます。 paramA=val1,val2

しかし、デメリットもあります。

  • のような一部のフレームワークのみです。 JAX-RS は行列パラメータをサポートしています。
  • ブラウザがGETでフォームを送信すると、paramはquery paramsになる。つまり、同じタスクに対して2種類のパラメータが存在することになってしまうのです。RESTサービスのユーザーを混乱させないためにも、またサービスの開発者の労力を軽減するためにも、この分野では常にクエリパラメータを使用する方が簡単でしょう。

サービスの開発者はmatrix paramをサポートするフレームワークを選ぶことができるので、残る唯一の欠点は、ブラウザがデフォルトでクエリパラメータを作成することでしょう。

他にデメリットはありますか?あなたならどうしますか?

解決方法は?

重要な違いは、マトリクスパラメータは特定のパス要素に適用されるのに対し、クエリパラメータはリクエスト全体に適用されることです。 これは、複数のレベルのリソースやサブリソースに対して複雑なRESTスタイルのクエリを実行する際に、活きてくるものです。

http://example.com/res/categories;name=foo/objects;name=green/?page=1

結局のところ、名前空間(namespacing)の問題なんです。

注:ここでいうリソースの「レベル」は categoriesobjects .

もしクエリパラメータだけを使って複数階層の URL を作成した場合、次のようになります。

http://example.com/res?categories_name=foo&objects_name=green&page=1

この方法では、リクエスト内のパラメータの局所性によって追加される明確さも失われます。 さらに、JAX-RSのようなフレームワークを使用する場合、すべてのクエリパラメータは各リソースハンドラ内で表示され、潜在的な競合や混乱を招くでしょう。

クエリが1つのレベルしかない場合、その違いはあまり重要ではなく、2つのタイプのパラメータは事実上交換可能です。しかし、クエリパラメータの方が一般的にサポートが良く、より広く認識されています。 一般に、HTMLフォームやシンプルで単一レベルのHTTP APIなどでは、クエリパラメータにこだわることをお勧めします。