Maneira correta de passar vários valores para o mesmo nome de parâmetro na solicitação GET


192

Eu estou olhando para o que é a maneira correta de passar vários valores para o mesmo nome de parâmetro em uma solicitação GET.

Eu já vi URLs como este:

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

E vi URLs como este:

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

Meu entendimento é que o primeiro está correto, mas não consigo encontrar nenhuma referência para isso. Dei uma olhada nas especificações http, mas não consegui ver nada sobre como a parte 'query' de um URL deve ser composta.

Não quero uma resposta que diga "qualquer um está bom" - se estou construindo um serviço da web, quero saber qual desses métodos é padrão para que as pessoas que usam o serviço da web saibam como passar vários parâmetros para o mesmo nome.

Então, alguém pode me indicar uma fonte de referência oficial para confirmar qual opção está correta?

Respostas:


164

De fato, não existe um padrão definido. Para dar suporte a essas informações, dê uma olhada na wikipedia, no capítulo Query String . Há o seguinte comentário:

Embora não haja um padrão definitivo, a maioria das estruturas da Web permite que vários valores sejam associados a um único campo. [3] [4]

Além disso, quando você analisa o RFC 3986 , na seção 3.4 Consulta , não há definição para parâmetros com vários valores.

A maioria dos aplicativos usar a primeira opção que você tem mostrado: http://server/action?id=a&id=b. Para dar suporte a essas informações, consulte este link Stackoverflow e este link MSDN referente aos aplicativos ASP.NET, que usam o mesmo padrão para parâmetros com vários valores.

No entanto, como você está desenvolvendo as APIs, sugiro que você faça o que for mais fácil para você, pois o chamador da API não terá muitos problemas para criar a sequência de consultas.


Na ausência de qualquer informação em contrário, acho que você está certo - se o RFC3986 não especificar um padrão, não haverá um. Obrigado Eduardo.
precisa saber é o seguinte

18
A sugeriria o uso id=a&id=bcomo booleano AND e id=a,bbooleano OR.
Alex Skrypnyk

16
O FWIW PHP não suporta leitura de argumentos como ?id=5&id=3. O PHP leria apenas um valor para id aqui. Se bem me lembro, teria que ser assim para funcionar com PHP:?id[]=5&id[]=3
O que você tentou

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,bassume que o coma ,é um delimitador válido. Mas seus valores de parâmetro podem conter a ,. Em seguida, o cliente precisa escapar ,nos valores dos parâmetros de consulta. Mas você pode decidir que ;é melhor. Isso significa que o cliente e o servidor devem compartilhar o delimitador oficial da sua API. id=a&id=bnão tem esse problema, embora ele faz urls mais
Ronan Quillevere

5

Eu sugeriria ver como os navegadores lidam com formulários por padrão. Por exemplo, dê uma olhada no elemento de formulário <select multiple>e como ele lida com vários valores desse exemplo em 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 em PHP:

<select name="cars[]" multiple>

Exemplo ao vivo de cima em w3schools.com

De cima, se você clicar em "saab, opel" e clicar em enviar, o resultado será cars = saab & cars = opel . Então, dependendo do servidor back-end, o parâmetro cars devem aparecer como uma matriz que você pode processar posteriormente.

Espero que isso ajude quem procura uma maneira mais 'padrão' de lidar com esse problema.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.