web-dev-qa-db-fra.com

Un paramètre de requête url est-il valide s'il n'a pas de valeur?

Est-ce une url comme http://example.com/foo?bar valide?

Je cherche un lien vers quelque chose d'officiel qui dit d'une manière ou d'une autre. Une simple réponse oui/non ou des preuves anecdotiques ne suffiront pas.

120
Conley Owens
  • Valable pour le RFC URI
  • Probablement acceptable par votre framework/code côté serveur

Le RI RFC ne requiert pas de format pour la chaîne de requête. Bien qu'il soit reconnu que la chaîne de requête comportera souvent des paires nom-valeur, elle n'est pas obligatoire (par exemple, elle contiendra souvent un autre URI).

3.4. Question

Le composant de requête contient des données non hiérarchiques qui, avec les données du composant de chemin d'accès (Section 3.3), servent à identifier une ressource dans la portée du schéma et de l'autorité de dénomination de l'URI (le cas échéant). ...

... Cependant, les composants de requête étant souvent utilisés pour transporter des informations d'identification sous la forme de paires "clé = valeur" et une valeur fréquemment utilisée est une référence à un autre URI, ...

HTML établit qu'un formulaire soumis via HTTP GET devrait coder les valeurs de formulaire sous forme de paires nom-valeur sous la forme "? clé1 = valeur1 & clé2 = valeur2 ..." (correctement encodé). L'analyse de la chaîne de requête dépend du code côté serveur (par exemple Java) du moteur de servlet).

Vous n'identifiez pas la structure côté serveur que vous utilisez, le cas échéant, mais il est possible que votre structure côté serveur présume que la chaîne de requête sera toujours en paires nom-valeur et qu'elle risque de s'étouffer avec une chaîne de requête qui n'est pas dans ce format (par exemple, ?bar). Si c'est votre propre code personnalisé analysant la chaîne de requête, vous devez simplement vous assurer de gérer ce format de chaîne de requête. Si c'est un framework, vous devrez consulter votre documentation ou simplement la tester pour voir comment elle est gérée.

90
Bert F

Ils sont parfaitement valables. Vous pourriez les considérer comme l’équivalent du grand gars musclé qui se tient silencieusement derrière le messager de la foule. Le gars n'a pas de nom et ne parle pas, mais sa simple présence transmet des informations.

69
Marc B

"Le schéma" http "permet de localiser les ressources réseau via le protocole HTTP. Cette section définit la syntaxe et la sémantique propres au schéma pour les URL http." http://www.w3.org/Protocols/rfc2616/rfc2616.html

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

Alors oui, tout est valable après un point d'interrogation. Votre serveur peut interpréter différemment, mais de façon anecdotique , vous pouvez voir que certaines langues traitent cela comme une valeur booléenne qui est vraie si elle est listée.

8
Jeff Ferland

Oui, c'est valide.

Si on veut simplement vérifier si le paramètre existe ou non, c'est une façon de le faire.

6
Oded

Spéc. URI

La seule partie pertinente de la spécification d'URI est de savoir tout entre le premier ? Et le premier # Correspond à la définition de la requête donnée par la spécification. Il peut inclure des caractères tels que [:/.?]. Cela signifie qu'une chaîne de requête telle que ?bar Ou ?ten+green+apples Est valide.

Trouvez le RFC 3986 ici

Spéc. HTML

isindex n'est pas HTML5 de manière significative.

Il est fourni obsolète pour être utilisé comme premier élément d'un formulaire et est soumis sans nom.

Si le nom de l'entrée est "isindex", son type est "text" et qu'il s'agit de la première entrée du jeu de données de formulaire, ajoutez ensuite la valeur au résultat et ignorez le reste des sous-étapes de cette entrée pour passer à la suivante. l’entrée, le cas échéant, ou l’étape suivante de l’algorithme général autrement.

Le drapeau isindex est réservé à l'usage hérité. Les formulaires dans des documents HTML conformes ne génèrent pas de charges utiles qui doivent être décodées avec cet ensemble d'indicateurs.

La dernière fois isindex était pris en charge était HTML . Son utilisation en HTML5 est de fournir une compatibilité ascendante plus facile.

Support dans les bibliothèques

La prise en charge de ce format d'URI dans les bibliothèques varie. Toutefois, certaines bibliothèques fournissent une prise en charge héritée pour faciliter l'utilisation de isindex.

Perl RI.pm (support spécial)

Certaines bibliothèques comme RI de Perl fournissent des méthodes pour analyser ce type de structures

$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 (pas de support spécial)

Comme autre exemple beaucoup plus fréquent, node.js Prend la route normale et facilite l’analyse en tant que

  • Un string
  • ou, un objet de clés et de valeurs (en utilisant parseQueryString)

La plupart des autres API d’analyse d’URI suivent un comportement similaire à celui-ci.

4
Evan Carroll
3
thirtydot

isindex obsolète magie name de HTML5

Cette fonctionnalité obsolète permet à un formulaire de générer une telle URL, fournissant ainsi une preuve supplémentaire de sa validité pour HTML. Par exemple.:

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

génère une URL de type:

?bar

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

isindex est toutefois obsolète comme indiqué à: https://stackoverflow.com/a/41689431/895245

Comme toutes les autres réponses décrites, il est parfaitement valide pour le contrôle, spécialement pour les choses de type booléen

Voici une fonction simple pour obtenir la chaîne de requête par nom:

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, " "));
}

et maintenant vous voulez vérifier si la chaîne de requête que vous recherchez existe ou non, vous pouvez faire une chose simple comme:

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

la exampleQueryString sera false si la fonction ne trouve pas la chaîne de requête, sinon elle sera true.

1
M98