Um parâmetro de consulta de URL é válido se não tiver valor?

138

Um URL é http://example.com/foo?barválido?

Estou procurando um link para algo oficial que diga de uma forma ou de outra. Uma resposta sim / não simples ou uma evidência anedótica não será suficiente.

Conley Owens
fonte
3
Além da URI RFC, quero destacar um exemplo disso no mundo real. O Drupal usa esses parâmetros de consulta sem valor em alguns links como uma forma de impedir o cache. por exemplo, www.google-analytics.com/analytics.js?o490ub ou /themes/seven/ie.css?o4eppb. Você provavelmente já sabe disso, mas alguns tropeçando nisso talvez não.
Elijah Lynn

Respostas:

103
  • Válido para o URI RFC
  • Provavelmente aceitável para a estrutura / código do servidor

O URI RFC não exige um formato para a cadeia de caracteres de consulta. Embora seja reconhecido que a string de consulta geralmente carrega pares nome-valor, não é necessário (por exemplo, geralmente conterá outro URI).

3.4 Inquerir

O componente de consulta contém dados não hierárquicos que, juntamente com os dados no componente de caminho (Seção 3.3), servem para identificar um recurso dentro do escopo do esquema do URI e da autoridade de nomenclatura (se houver). ...

... No entanto, como os componentes de consulta geralmente são usados ​​para transportar informações de identificação na forma de pares "chave = valor" e um valor usado com frequência é uma referência a outro URI, ...

O HTML estabelece que um formulário enviado via HTTP GET deve codificar os valores do formulário como pares nome-valor no formato "? Key1 = value1 & key2 = value2 ..." (codificado corretamente). A análise da sequência de consultas depende do código do servidor (por exemplo, mecanismo de servlet Java).

Você não identifica a estrutura do lado do servidor que usa, se houver, mas é possível que a estrutura do lado do servidor assuma que a cadeia de caracteres de consulta sempre estará em pares nome-valor e pode engasgar com uma cadeia de caracteres de consulta que não seja nesse formato (por exemplo ?bar). Se for seu próprio código personalizado, analisando a sequência de consultas, basta garantir que você lide com esse formato de sequência de consultas. Se for uma estrutura, você precisará consultar sua documentação ou simplesmente testá-la para ver como ela é tratada.

Bert F
fonte
7
O ASP.NET MVC (versões 4 e 5, que eu saiba) definitivamente engasga quando não há valor fornecido :(
AR
2
A isindexmágica namedo HTML5 permite o envio de uma string de consulta sem o formato de valor-chave stackoverflow.com/a/37579004/895245
Ciro Santilli
@CiroSantilli, 2016 六四 事件 法轮功 como um recurso descontinuado para suporte legado ao HTML3
Evan Carroll
80

Eles são perfeitamente válidos. Você poderia considerá-los o equivalente ao grande homem musculoso parado silenciosamente atrás do mensageiro da máfia. O cara não tem nome e não fala, mas sua mera presença transmite informações.

Marc B
fonte
19
O cara musculoso do mafioso tem um nome, você simplesmente não sabe. Você o conhece no parâmetro e, basicamente, carrega um valor booleano (presente, ausente).
Vlasec
2
A melhor maneira de descrevê-lo :)
Mohammad Kermani
1
Nome do grande cara é Cheich , a partir desse episódio casino heist em Star Trek: Deep Space 9.
Anthony Rutledge
8

"O esquema" http "é usado para localizar recursos de rede por meio do protocolo HTTP. Esta seção define a sintaxe e a semântica específicas do esquema para URLs http." http://www.w3.org/Protocols/rfc2616/rfc2616.html

http_URL = "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]] 

Então, sim, qualquer coisa é válida após um ponto de interrogação. Seu servidor pode interpretar de maneira diferente, mas, curiosamente , você pode ver alguns idiomas tratando isso como um valor booleano que é verdadeiro se listado.

Jeff Ferland
fonte
6
Para obter a definição formal, consulte o RFC 2396 ( ietf.org/rfc/rfc2396.txt ), que é silencioso no conteúdo da string de consulta, exceto para especificar o conjunto legal de caracteres e aqueles que têm um significado especial. Especificamente, ele diz que o "componente de consulta é uma sequência de informações a serem interpretadas pelo recurso", o que implica que sua definição depende do protocolo e, portanto, o valor key = é amplamente por convenção.
RobertB
6

Sim, é válido.

Se alguém quiser simplesmente verificar se o parâmetro existe ou não, esta é uma maneira de fazê-lo.

Oded
fonte
4

Especificação de URI

A única parte relevante da especificação do URI é saber tudo entre o primeiro ?e o primeiro #se encaixa na definição de consulta da especificação. Pode incluir caracteres como [:/.?]. Isso significa que uma string de consulta como ?bar, ou?ten+green+apples é válida.

Encontre o RFC 3986 aqui

Especificações HTML

isindex não é significativamente HTML5.

Ele foi descontinuado para uso como o primeiro elemento apenas de um formulário e é enviado sem um nome.

Se o nome da entrada for "isindex", seu tipo for "text" e esta for a primeira entrada no conjunto de dados do formulário, acrescente o valor ao resultado e pule o restante das subetapas para essa entrada, passando para a próxima entrada, se houver, ou a próxima etapa no algoritmo geral, caso contrário.

O sinalizador isindex é apenas para uso legado. Os formulários nos documentos HTML em conformidade não geram cargas úteis que precisam ser decodificadas com esse conjunto de sinalizadores.

A última vez que isindex foi suportado foi HTML3 . Seu uso no HTML5 é fornecer compatibilidade retroativa mais fácil.

Suporte em bibliotecas

O suporte nas bibliotecas para este formato de URI varia, no entanto, algumas bibliotecas fornecem suporte legado para facilitar o uso isindex.

Perl URI.pm (suporte especial)

Algumas bibliotecas como o URI do Perl fornecem métodos para analisar esse tipo de estrutura

$uri->query_keywords
$uri->query_keywords( $keywords, ... )
$uri->query_keywords( \@keywords )
Sets and returns query components that use the keywords separated by "+" format.

Node.js url (sem suporte especial)

Como outro exemplo muito mais frequente, node.jssegue a rota normal e facilita a análise, pois

  • Uma linha
  • ou, um objeto de chaves e valores (usando parseQueryString)

A maioria das outras APIs de análise de URI segue algo semelhante a isso.

Evan Carroll
fonte
3

isindexmagia obsoleta namedo HTML5

Esse recurso descontinuado permite que um envio de formulário gere esse URL, fornecendo mais evidências de que ele é válido para HTML. Por exemplo:

<form action="#isindex" class="border" id="isindex" method="get">
  <input type="text" name="isindex" value="bar"/>
  <button type="submit">Submit</button>
</form>

gera um URL do tipo:

?bar

Padrão: https://www.w3.org/TR/html5/forms.html#naming-form-controls:-the-name-attribute

isindexé, no entanto, preterido, conforme mencionado em: https://stackoverflow.com/a/41689431/895245

Ciro Santilli adicionou uma nova foto
fonte
1

Como todas as outras respostas descritas, é perfeitamente válido para verificação, especialmente para coisas do tipo booleano

Aqui está uma função simples para obter a string de consulta pelo nome:

function getParameterByName(name, url) {
    if (!url) {
        url = window.location.href;
    }
    name = name.replace(/[\[\]]/g, "\\$&");
    var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
        results = regex.exec(url);
    if (!results) return null;
    if (!results[2]) return '';
    return decodeURIComponent(results[2].replace(/\+/g, " "));
}

e agora você deseja verificar se a string de consulta que você procura existe ou não, faça algo simples como:

var exampleQueryString = (getParameterByName('exampleQueryString') != null);

o exampleQueryStringserá falsese a função não consegue encontrar a string de consulta, caso contrário será true.

Mohammad Kermani
fonte