Estou com problemas para encontrar informações autorizadas sobre o comportamento dos campos duplicados da sequência de consultas HTTP GET, como
http://example.com/page?field=foo&field=bar
e, em particular, se o pedido for mantido ou não. A maioria das linguagens orientadas à web produz uma matriz que contém foo e bar associados a um "campo" principal, mas eu gostaria de saber se existe uma declaração autorizada (por exemplo, em uma RFC) sobre esse ponto. O RFC 3986 possui uma seção 3.4. Query
, que se refere aos pares chave = valor, mas nada é dito sobre como interpretar a ordem e os campos duplicados e assim por diante. Isso faz sentido, já que é dependente de back-end e não está no escopo dessa RFC ...
Embora exista um padrão de fato, eu gostaria de ver uma fonte autorizada para isso, apenas por curiosidade.
Respostas:
Não há especificações sobre isso. Você pode fazer o que quiser.
As abordagens típicas incluem: primeiro, último, conjunto de todos, junção de cadeia com vírgula de todos.
Suponha que a solicitação bruta seja:
Existem várias opções para o que
request.query['tag']
deve render, dependendo do idioma ou da estrutura:fonte
Posso confirmar que, para PHP (pelo menos na versão 4.4.4 e mais recente), funciona assim:
resulta em:
Mas
resulta em:
Esse comportamento é o mesmo para dados GET e POST.
fonte
[]
sufixo parece um comportamento realmente estranho, mas se você tentar enviar uma matriz como argumento via jQuery.ajax()
, ela será automaticamente adicionada da mesma maneira. Parece que isso é para benefício dos usuários de PHP.$foo[] = 1
anexa a uma matriz. O Django (Python) também faz a mesma coisa.A resposta de yfeldblum é perfeita.
Apenas uma observação sobre um quinto comportamento que notei recentemente: no Windows Phone , abrir um aplicativo com uma interface de usuário com uma chave de consulta duplicada resultará em NavigationFailed with:
O culpado é
System.Windows.Navigation.UriParsingHelper.InternalUriParseQueryStringToDictionary(Uri uri, Boolean decodeResults)
.Portanto, o sistema nem permitirá que você lide com isso da maneira que quiser, o proibirá. Você tem a única solução para escolher seu próprio formato (CSV, JSON, XML, ...) e uri-escape-it.
fonte
NavigationFailed
para esse URI. Mas, desculpe-me, abandonei o desenvolvimento do Windows (Phone) um mês após esta postagem e mudei para o macOS (iOS), então não posso mais ajudar a rastrear esse problema hoje em dia.A maioria (todas?) Das estruturas não oferece garantias, portanto, assuma que elas serão retornadas em ordem aleatória.
Sempre adote a abordagem mais segura.
Por exemplo, interface Java HttpServlet: ServletRequest.html # getParameterValues
Até o método getParameterMap não menciona a ordem dos parâmetros (a ordem de um iterador java.util.Map também não pode ser invocada.)
fonte
Normalmente, valores de parâmetros duplicados, como
resultam em um único parâmetro queryString que é uma matriz:
Eu já vi esse comportamento no ASP, ASP.NET e PHP4.
fonte
Eu tive a mesma pergunta. Estou escrevendo a função javascript para analisar e modificar consultas. Não sei se uma string de consulta possui nomes duplicados ou entre colchetes, como x [] = 1 & x [] = 2, é padrão, embora alguns idiomas suportem esse formato.
Mas acho que o Chrome e o Firefox têm uma nova classe denominada
URLSeachParams
e suporta apenas o formato mais simples comoname=value
. Se houver nomes duplicados na string de consulta, oget
método deURLSearchParams
retornará apenas o primeiro.Então, pessoalmente, talvez um URL mais simples e sem nomes duplicados seja muito mais seguro para o futuro.
fonte
URLSearchParams.getAll('x')