153

HTTP GET クエリ文字列の重複フィールドの動作に関する信頼できる情報を見つけるのに問題があります。

http://example.com/page?field=foo&field=bar 

特に、注文が守られているかどうか。ほとんどの Web 指向言語は、キー「フィールド」に関連付けられた foo と bar の両方を含む配列を生成しますが、この点について (RFC などで) 信頼できる声明が存在するかどうかを知りたいです。RFC 3986には、キー=値のペアを参照するセクション3.4. Queryがありますが、順序や重複フィールドなどを解釈する方法については何も述べられていません。バックエンドに依存し、その RFC の範囲内ではないため、これは理にかなっています...

事実上の標準は存在しますが、好奇心から、その信頼できる情報源を見たいと思います。

4

7 に答える 7

127

これに関する仕様はありません。あなたは好きなことをするかもしれません。

典型的なアプローチには、最初に与えられたもの、最後に与えられたもの、すべての配列、すべてのコンマを使用した文字列結合などがあります。

生のリクエストが次のとおりであるとします。

GET /blog/posts?tag=ruby&tag=rails HTTP/1.1
Host: example.com

request.query['tag']次に、言語またはフレームワークに応じて、何を生成するかについてさまざまなオプションがあります。

request.query['tag'] => 'ruby'
request.query['tag'] => 'rails'
request.query['tag'] => ['ruby', 'rails']
request.query['tag'] => 'ruby,rails'
于 2009-11-17T04:21:42.657 に答える
15

PHP (少なくともバージョン 4.4.4 以降) では、次のように動作することを確認できます。

GET /blog/posts?tag=ruby&tag=rails HTTP/1.1
Host: example.com

結果:

request.query['tag'] => 'rails'

しかし

GET /blog/posts?tag[]=ruby&tag[]=rails HTTP/1.1
Host: example.com

結果:

request.query['tag'] => ['ruby', 'rails']

この動作は、GET データと POST データで同じです。

于 2012-01-23T12:20:35.993 に答える
8

yfeldblum の答えは完璧です。

最近気づいた 5 番目の動作についてのメモ: Windows Phoneで、クエリ キーが重複している uri を使用してアプリケーションを開くと、次のような NavigationFailed が発生します。

System.ArgumentException: 同じキーを持つアイテムが既に追加されています。

犯人はSystem.Windows.Navigation.UriParsingHelper.InternalUriParseQueryStringToDictionary(Uri uri, Boolean decodeResults)

したがって、システムはあなたが望むようにそれを処理することさえできず、禁止します。独自の形式 (CSV、JSON、XML など) と uri-escape-it を選択する唯一のソリューションが残されています。

于 2014-10-13T13:55:05.063 に答える
5

フレームワークのほとんど (すべて?) は保証を提供しないため、ランダムな順序で返されると仮定します。

常に最も安全な方法をとってください。

たとえば、Java HttpServlet インターフェイス: ServletRequest.html#getParameterValues

getParameterMapメソッドでさえ、パラメーターの順序について言及していません (java.util.Map イテレーターの順序も信頼できません)。

于 2009-11-17T04:18:08.003 に答える
3

通常、次のような重複するパラメーター値

http://example.com/page?field=foo&field=bar

配列である単一の queryString パラメータになります。

field[0]=='foo'
field[1]=='bar'

ASP、ASP.NET、および PHP4 でこの動作を見てきました。

于 2009-11-17T04:09:04.787 に答える