GETリクエストで同じパラメーター名に複数の値を渡す正しい方法


192

GETリクエストで同じパラメーター名に複数の値を渡す正しい方法を調べています。

私はこのようなURLを見ました:

http://server/action?id=a&id=b

そして、私はこのようなURLを見ました:

http://server/action?id=a,b

私の理解は、最初のものが正しいということですが、これについての参照は見つかりません。私はhttp仕様を調べましたが、URLの「クエリ」部分をどのように構成するかについて何もわかりませんでした。

「どちらでもかまいません」という答えは欲しくない-Webサービスを構築している場合、これらのメソッドのどれが標準であるかを知りたいので、私のWebサービスを使用している人々が同じ名前の複数のパラメーターを渡す方法を知っています。

それで、誰かが私を公式の参照元に向けて、どのオプションが正しいかを確認できますか?

回答:


164

実際、定義された標準はありません。その情報をサポートするには、クエリ文字列の章でウィキペディアを参照してください。次のコメントがあります。

明確な標準はありませんが、ほとんどのWebフレームワークでは、単一のフィールドに複数の値を関連付けることができます。[3] [4]

さらに、RFC 3986のセクション3.4 Queryを見ると、複数の値を持つパラメーターの定義はありません。

ほとんどのアプリケーションは、最初に示したオプションを使用しますhttp://server/action?id=a&id=b。その情報をサポートするには、このStackoverflowリンクと、ASP.NETアプリケーションに関するこのMSDNリンクをご覧ください。これらのアプリケーションは、複数の値を持つパラメーターに同じ標準を使用しています。

ただし、APIを開発しているので、APIの呼び出し元はクエリ文字列を作成するのにそれほど問題がないため、最も簡単な方法を実行することをお勧めします。


反対の情報がない場合、私はあなたが正しいと思います-RFC3986が規格を指定していない場合、規格はありません。エドゥアルドに感謝します。
stripybadger

18
Aはid=a&id=b、ブールANDおよびid=a,bブールORとして使用することをお勧めします。
Alex Skrypnyk 2016年

16
FWIW PHPはのような引数の読み取りをサポートしていません?id=5&id=3。PHPは、ここではidの1つの値のみを読み取ります。私の記憶が正しければ、それはPHPで動作するようにそれをこのようになりしなければならない:?id[]=5&id[]=3
あなたがしようとしたものを持って

3
+1since you are developing the APIs, I suggest you to do what is the easiest for you, since the caller of the API will not have much trouble creating the query string.
Amr

2
id=a,bコマ,は有効な区切り文字であると想定しています。ただし、パラメータ値にはを含めることができます,。次に、クライアント,はクエリパラメータ値でエスケープする必要があります。しかし、あなた;はより良いと決めることができます。これは、クライアントとサーバーがAPIの公式の区切り文字を共有する必要があることを意味します。id=a&id=bURLが長くなってもこの問題はありません
Ronan Quillevere

5

ブラウザがデフォルトでフォームを処理する方法を確認することをお勧めします。たとえば<select multiple>、w3schools でのフォーム要素と、この例の複数の値を処理する方法を見てみましょう。

<form action="/action_page.php">
<select name="cars" multiple>
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="opel">Opel</option>
  <option value="audi">Audi</option>
</select>
<input type="submit">
</form>

PHPを使用する場合:

<select name="cars[]" multiple>

w3schools.comで上からライブ例

上から「saab、opel」をクリックして送信をクリックすると、cars = saab&cars = opelの結果が生成されます。次に、バックエンドサーバーに応じて、carパラメータは、さらに処理できる配列として表示されます。

これがこの問題を処理するより「標準的な」方法を探している人を助けることを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.