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?

stripybadger
fonte

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.

EduardoFernandes
fonte
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.

phanf
fonte