Um URL é http://example.com/foo?bar
vá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.
Um URL é http://example.com/foo?bar
vá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.
Respostas:
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.
isindex
mágica name
do HTML5 permite o envio de uma string de consulta sem o formato de valor-chave stackoverflow.com/a/37579004/895245
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.
"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.
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
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.
O suporte nas bibliotecas para este formato de URI varia, no entanto, algumas bibliotecas fornecem suporte legado para facilitar o uso isindex
.
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.
url
(sem suporte especial)Como outro exemplo muito mais frequente, node.js
segue a rota normal e facilita a análise, pois
parseQueryString
)A maioria das outras APIs de análise de URI segue algo semelhante a isso.
parse_url
segue uma implementação semelhante, mas retorna apenas a string da consulta. A análise em um objeto de k=>v
requerparse_string()
É válido: consulte Wikipedia , RFC 1738 (3.3. HTTP) , RFC 3986 (3. Componentes de sintaxe) .
isindex
magia obsoleta name
do 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
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 exampleQueryString
será false
se a função não consegue encontrar a string de consulta, caso contrário será true
.