Forma correcta de pasar varios valores para el mismo nombre de parámetro en la solicitud GET

192

Estoy investigando cuál es la forma correcta de pasar múltiples valores para el mismo nombre de parámetro en una solicitud GET.

He visto URL como esta:

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

Y he visto URL como esta:

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

Entiendo que lo primero es correcto, pero no puedo encontrar ninguna referencia para esto. Eché un vistazo a la especificación http pero no pude ver nada acerca de cómo se debe componer la parte 'consulta' de una URL.

No quiero una respuesta que diga "tampoco está bien". Si estoy creando un servicio web, quiero saber cuál de estos métodos es estándar para que las personas que usan mi servicio web sepan cómo pasar múltiples parámetros para el mismo nombre.

Entonces, ¿alguien puede señalarme una fuente de referencia oficial para confirmar qué opción es la correcta?

stripybadger
fuente

Respuestas:

165

De hecho, no hay un estándar definido. Para respaldar esa información, eche un vistazo a wikipedia, en el capítulo Cadena de consulta . Hay el siguiente comentario:

Si bien no existe un estándar definitivo, la mayoría de los marcos web permiten asociar múltiples valores a un solo campo. [3] [4]

Además, cuando eche un vistazo al RFC 3986 , en la sección 3.4 Consulta , no hay una definición para los parámetros con múltiples valores.

La mayoría de las aplicaciones utilizan la primera opción que ha demostrado: http://server/action?id=a&id=b. Para admitir esa información, eche un vistazo a este enlace de Stackoverflow y este enlace de MSDN con respecto a las aplicaciones ASP.NET, que usan el mismo estándar para parámetros con múltiples valores.

Sin embargo, dado que está desarrollando las API, le sugiero que haga lo que sea más fácil para usted, ya que el llamador de la API no tendrá muchos problemas para crear la cadena de consulta.

EduardoFernandes
fuente
En ausencia de cualquier información en contrario, supongo que tiene razón: si RFC3986 no especifica un estándar, entonces no hay ninguno. Gracias Eduardo
stripybadger
19
A sugeriría usar id=a&id=bcomo booleano AND, y id=a,bcomo booleano OR.
Alex Skrypnyk
17
FWIW PHP no admite la lectura de argumentos como ?id=5&id=3. PHP solo leería en un valor para id aquí. Si no recuerdo mal, tendría que tener este aspecto para que funcione con PHP:?id[]=5&id[]=3
¿Qué has intentado el
3
+1 parasince 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,bsupone que el coma ,es un delimitador válido. Pero los valores de sus parámetros pueden contener a ,. Entonces el cliente necesita escapar ,en los valores de los parámetros de consulta. Pero podrías decidir que ;es mejor. Significa que el cliente y el servidor deben compartir el delimitador oficial para su API. id=a&id=bno tiene este problema a pesar de que alarga las URL
Ronan Quillevere
5

Sugeriría mirar cómo los navegadores manejan los formularios de forma predeterminada. Por ejemplo, eche un vistazo al elemento de formulario <select multiple>y cómo maneja los valores múltiples de este ejemplo en 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>

Para uso de PHP:

<select name="cars[]" multiple>

Ejemplo en vivo desde arriba en w3schools.com

Desde arriba, si hace clic en "saab, opel" y hace clic en enviar, generará un resultado de cars = saab & cars = opel . Luego, dependiendo del servidor de servicios de fondo, los vagones de parámetros deben aparecer como una matriz que puede procesar aún más.

Espero que esto ayude a cualquiera que busque una forma más "estándar" de manejar este problema.

phanf
fuente