Qual é a diferença entre parâmetros de URL e strings de consulta?

92

Não vejo muita diferença entre os parâmetros e as strings de consulta no URL. Então, qual é a diferença e quando um deve ser usado em vez do outro?

Konst
fonte
1
Você tem um contexto, porque, pelo que eu sei, os dois geralmente são usados ​​para o mesmo - mas seu caso pode ser específico do contexto.
Allan S. Hansen,
Não tenho um contexto específico, é uma questão geral. Em que caso devo usar um caminho em vez de outro. Deve haver usos diferentes para esses dois.
Konst
Pessoalmente - eu uso principalmente a palavra parâmetro quando considero eles em uma variável ou contexto de chamada de método, e string de consulta quando falo sobre eles no contexto de URL. (por exemplo: a string de consulta é dividida em parâmetros para o método). Mas é apenas uma linguagem, então o contexto e as situações diferem e eu duvido que alguém iria te perseguir por usar qualquer uma delas quando você "sentir" vontade :)
Allan S. Hansen,

Respostas:

85

O componente de consulta é indicado pelo primeiro ?em um URI. "Query string" pode ser um sinônimo (este termo não é usado no padrão URI).

Alguns exemplos de URIs HTTP com componentes de consulta:

http://example.com/foo?bar
http://example.com/foo/foo/foo?bar/bar/bar
http://example.com/?bar
http://example.com/?@bar._=???/1:
http://example.com/?bar1=a&bar2=b

( lista de caracteres permitidos no componente de consulta )

O "formato" do componente de consulta fica por conta dos autores do URI. Uma convenção comum ( mas nada mais que uma convenção, no que diz respeito ao padrão URI ¹) é usar o componente de consulta para pares chave-valor, também conhecido como. parâmetros , como no último exemplo acima: bar1=a&bar2=b.

Esses parâmetros também podem aparecer nos outros componentes do URI, ou seja, o caminho² e o fragmento. No que diz respeito ao padrão URI, cabe a você qual componente e qual formato usar.

URI de exemplo com parâmetros no caminho, a consulta e o fragmento:

http://example.com/foo;key1=value1?key2=value2#key3=value3

¹ O padrão URI diz sobre o componente de consulta :

[...] componentes de consulta são frequentemente usados ​​para transportar informações de identificação na forma de pares "chave = valor" [...]

² O padrão URI diz sobre o componente do caminho :

[…] O ponto-e-vírgula (";") e os caracteres reservados de igual ("=") são freqüentemente usados ​​para delimitar parâmetros e valores de parâmetros aplicáveis ​​a esse segmento. O caractere reservado de vírgula (",") é freqüentemente usado para fins semelhantes.

unor
fonte
1
Parâmetro e consulta são diferentes. Ver secções 3.3 e 3.4 em tools.ietf.org/html/rfc2396.html
cowlinator
@cowlinator: (RFC 2396 está obsoleto, mas o padrão atual, RFC 3986, diz algo semelhante sobre parâmetros no componente de caminho ). Eu não disse que eles são iguais ou disse? Os autores de URI podem especificar parâmetros no componente de consulta (conforme descrito em minha resposta) e também podem especificar parâmetros no componente de caminho (conforme descrito em sua referência) - em ambos os casos é apenas uma convenção, nada que o padrão defina. - Você sugeriria uma mudança na minha resposta? Você acha que OP significa parâmetros no caminho?
até
30

Os parâmetros são pares de valores-chave que podem aparecer dentro do caminho do URL e começam com um ponto e vírgula ( ;).

A string de consulta aparece após o caminho (se houver) e começa com um caractere de ponto de interrogação ( ?).

Os parâmetros e a string de consulta contêm pares de valores-chave.

Em uma GETsolicitação, os parâmetros aparecem no próprio URL:

<scheme>://<username>:<password>@<host>:<port>/<path>;<parameters>?<query>#<fragment>

Em uma POSTsolicitação, os parâmetros podem aparecer na própria URL, mas também no fluxo de dados (conhecido como conteúdo).

A string de consulta sempre faz parte do URL.

Os parâmetros podem ser enterrados no form-datafluxo de dados ao usar o método POST para que eles não apareçam no URL. Sim, uma POSTsolicitação pode definir parâmetros como dados do formulário e na URL, e isso não é inconsistente porque os parâmetros podem ter vários valores.

Não encontrei explicação para esse comportamento até agora. Acho que às vezes pode ser útil "mostrar" os parâmetros de uma POSTsolicitação ou até mesmo deixar o código que manipula uma GETsolicitação compartilhar algumas partes com o código que trata a POST. É claro que isso pode funcionar apenas com o código do servidor que oferece suporte a parâmetros em uma URL.

Até obter melhores insights, sugiro que você use parâmetros apenas no form-datafluxo de dados de POSTsolicitações.

Fontes:

O que todo desenvolvedor deve saber sobre URLs

RFC 3986

Laurent Caillette
fonte