71 votes

Point-virgule comme séparateur de requête d'URL

ampersand vs semicolon

Bien qu'il soit fortement recommandé ( Source W3C via Wikipedia ) pour que les serveurs web prennent en charge le point-virgule comme séparateur d'éléments de requête d'URL (en plus de l'esperluette), elle ne semble pas être généralement suivie.

Par exemple, comparez

         http://www.google.com/search?q=nemo & oe=utf-8

         http://www.google.com/search?q=nemo ; oe=utf-8

résultats. (Dans ce dernier cas, le point-virgule est, ou l'était au moment de la rédaction de ce texte traité comme une chaîne de caractères ordinaire, comme si l'url était : http://www.google.com/search?q=nemo %3B oe=utf-8 )

Bien que la première bibliothèque d'analyse d'URL que j'ai essayée se comporte bien :

>>> from urlparse import urlparse, query_qs
>>> url = 'http://www.google.com/search?q=nemo;oe=utf-8'
>>> parse_qs(urlparse(url).query)
{'q': ['nemo'], 'oe': ['utf-8']}

Quel est le statut actuel de l'acceptation du point-virgule comme séparateur, et quels sont les problèmes potentiels ou les remarques intéressantes ? (tant du point de vue du serveur que du client)

1 votes

La recherche Google fait une chose - Golang fait le contraire : github.com/golang/go/issues/2210

40voto

geira Points 471

Le site Recommandation du W3C de 1999 est obsolète. Le statut actuel, selon le Recommandation du W3C de 2014 c'est que le point-virgule est maintenant illégal comme séparateur de paramètres :

Pour décoder les charges utiles codées en application/x-www-form-urlencode, l'algorithme suivant doit être utilisé. [...] La sortie de cet algorithme est une liste triée de paires nom-valeur. [...]

  1. Que les chaînes soient le résultat de la division stricte de la charge utile de la chaîne sur les caractères AMPERSAND U+0026 (&).

En d'autres termes, ?foo=bar;baz signifie que le paramètre foo aura la valeur bar;baz ; considérant que ?foo=bar;baz=sna devrait donner lieu à foo être bar;baz=sna (bien que techniquement illégale puisque la deuxième = doit être échappé en %3D ).

10 votes

Cette réponse est trompeuse parce qu'elle parle strictement de l'encodage du formulaire, ce qui n'est pas la question posée par le PO ni dans l'exemple inclus. L'encodage d'url de formulaire est très ancien et est utilisé lors de l'envoi de données via la balise <form> dont nous nous éloignons pour nous tourner vers AJAX. L'utilisation de & comme délimiteur était une vieille "erreur" malheureuse qui est maintenant préservée pour des raisons de rétrocompatibilité. L'utilisation du point-virgule est la voie à suivre, à condition que votre serveur web le supporte.

7 votes

Si vous lisez les normes HTTP et URL, vous verrez qu'elles ne définissent aucune syntaxe pour la chaîne de requête, à part l'échappement. En fait, les deux documents mentionnés sont les seules spécifications existantes pour les paramètres d'interrogation. Si vous avez techniquement raison de dire que l'encodage de forme (que les deux recommandations du W3C décrivent) concerne les requêtes POST, il n'existe pas de spécification similaire pour GET et les implémentations des navigateurs ont donc suivi la première. Les cadres modernes (par exemple Mojolicious) abandonnent également la prise en charge du séparateur de point-virgule et, à moins que tous les navigateurs ne soient réécrits, les esperluettes ne disparaîtront jamais.

2 votes

Pour ce qui est de l'évolution vers AJAX, notez que le système actuel de Swagger (alias OpenAPI) n'autorise que les paramètres délimités par des esperluettes ; les points-virgules ne sont autorisés que pour les paramètres de chemin ou de cookie. Si vous concevez une API qui contredit la spécification Swagger, vous avez un problème.

19voto

Daniel Vassallo Points 142049

Tant que votre serveur HTTP et votre application côté serveur acceptent les points-virgules comme séparateurs, tout devrait bien se passer. Je ne vois pas d'inconvénients. Comme vous l'avez dit, le La spécification du W3C est de votre côté :

Nous recommandons aux responsables de la mise en œuvre des serveurs HTTP, et en particulier aux responsables de la mise en œuvre des CGI, de prendre en charge l'utilisation de " ;" à la place de "&" pour éviter aux auteurs d'avoir à échapper les caractères "&" de cette manière.

1 votes

Est de voir au moins un inconvénient - du point de vue du client, que je ne peux pas décider sans risque d'utiliser ; au lieu de & dans la demande (ok, j'ajoute la mention du point de vue du client à la question)

0 votes

@mykhal : "Du point de vue du client"... vous voulez dire quand vous exposez une API sur un service web, ou similaire ? Parce que sinon, je pense que les utilisateurs finaux qui utilisent un site via un navigateur web ne devraient pas s'en soucier. En ce qui concerne la première question, oui, les consommateurs de services web pourraient être plus habitués à utiliser une API. & et pourraient être déroutés par cette convention inhabituelle.

0 votes

@[Daniel Vassallo] Je veux dire, en général. Au fait, j'abordais implicitement exactement la même citation du W3C que vous mentionnez dans votre réponse, qui n'est donc pas satisfaisante pour moi peu importe :)

10voto

mfripp Points 46

Je suis d'accord avec Bob Aman. La spécification du W3C est conçue pour faciliter l'utilisation d'hyperliens d'ancrage avec des URL qui ressemblent à des requêtes GET de formulaire (par exemple, " http://www.host.com/?x=1&y=2 "). Dans ce contexte, l'esperluette entre en conflit avec le système des références aux entités de caractères, qui commencent toutes par une esperluette (par exemple, ""e ;"). Le W3C recommande donc aux serveurs Web d'autoriser l'utilisation d'un point-virgule comme séparateur de champ à la place de l'esperluette, afin de faciliter l'écriture de ces URL. Mais cette solution exige que les rédacteurs se souviennent que l'esperluette doit être remplacée par quelque chose, et que le " ;" est un délimiteur de champ tout aussi valable, même si les navigateurs Web utilisent universellement l'esperluette. C'est sans doute plus difficile que de se souvenir de remplacer l'esperluette par un "&" dans ces liens, comme ils le feraient ailleurs dans le document.

Pour aggraver les choses, jusqu'à ce que tous les serveurs web autorisent les points-virgules comme délimiteurs de champ, les rédacteurs d'URL ne peuvent utiliser ce raccourci que pour certains hôtes, et doivent utiliser "&" pour d'autres. Ils devront également modifier leur code ultérieurement si un hôte donné n'autorise plus les points-virgules comme délimiteurs de champ. C'est certainement plus difficile que d'utiliser simplement "&", qui fonctionnera pour tous les serveurs à tout moment. En outre, cela n'incite pas les serveurs web à autoriser les points-virgules comme séparateurs de champ. À quoi bon, alors que tout le monde remplace déjà l'esperluette par "&" au lieu de " ;"?

0 votes

Je dis que c'est plus difficile pour continuer à n'utiliser que le & sans autoriser les deux. je dis que permettre aux personnes qui veulent une vie plus simple d'utiliser le ; leur facilitera d'autant plus la tâche que cela vaut la peine de se compliquer un peu plus du fait que certains sites ont parfois besoin de connaître les deux options.

0 votes

Le traitement des chaînes de requête avec le séparateur & est plus de deux fois plus compliqué que le passage à ; pour séparer les éléments de la chaîne de requête. L'utilisation de ; réduit considérablement les bogues potentiels liés à l'utilisation de chaînes endoctrinées HTML incorrectes pour l'utilisation de '&'.

0 votes

Je crois avoir entendu Matthias dire que l'utilisation de '&' comme séparateurs est préférable, simplement parce qu'ils sont déjà plus populaires. Et je dis que c'est un bon point. Et je ne m'y oppose pas. Ce que j'essaie de communiquer, c'est que si nous tous commencent à utiliser ';' à la place, il est plus facile pour le plus les gens à long terme. Je dis que ';' est mieux pour tous à utiliser que le "&". Et je dis aussi que jusqu'à ce que tout le monde passe à l'un ou l'autre, nous devrons faire face à un groupe qui le fait différemment, donc si nous voulons un code robuste, nous devons être capables de gérer les deux, quoi qu'il en soit.

4voto

Shawn Kovac Points 424

En bref, le HTML est un grand fouillis (en raison de son indulgence), et l'utilisation des points-virgules permet de le simplifier grandement. J'estime que lorsque je prends en compte les complications que j'ai trouvées, l'utilisation des esperluettes comme séparateur rend l'ensemble du processus trois fois plus compliqué que l'utilisation des points-virgules comme séparateurs !

Je suis un programmeur .NET et, à ma connaissance, .NET ne no J'ai donc écrit mes propres méthodes d'analyse et de traitement parce que je voyais une énorme valeur dans l'utilisation des points-virgules plutôt que dans le système déjà problématique des esperluettes comme séparateurs. Malheureusement, des personnes très respectables (comme @Bob Aman dans une autre réponse) ne voient pas l'intérêt de l'utilisation du point-virgule qui est de loin supérieure et tellement plus simple que l'utilisation des esperluettes. Je partage donc maintenant quelques points pour peut-être persuader d'autres développeurs respectables qui ne reconnaissent pas encore la valeur de l'utilisation des points-virgules à la place :

L'utilisation d'une chaîne de requête comme '?a=1&b=2' dans une page HTML est impropre (sans codage HTML préalable), mais la plupart du temps, elle fonctionne. Cela n'est toutefois dû qu'à la tolérance de la plupart des navigateurs, et cette tolérance peut conduire à des bogues difficiles à trouver lorsque, par exemple, la valeur de la paire clé-valeur est affichée dans l'URL d'une page HTML sans codage approprié (directement sous la forme '?a=1&b=2' dans la source HTML). Une chaîne de requête comme "?who=me+&+you" est également problématique.

Nous, les gens, pouvons avoir préjugés et pouvons être en désaccord sur nos partis pris toute la journée, il est donc très important de reconnaître nos partis pris. Par exemple, je suis d'accord pour dire que je trouve que les séparations avec " ;" sont plus "propres". Je reconnais que mon opinion "plus propre" est purement un préjugé. Et un autre développeur peut avoir un parti pris tout aussi opposé et tout aussi valable. Donc mon parti pris sur ce point n'est pas plus correct que le parti pris opposé.

Mais le soutien impartial du point-virgule, qui facilite la vie de tous à long terme, ne peut être contesté correctement si l'on tient compte de l'ensemble du tableau. En résumé, l'utilisation du point-virgule simplifie effectivement la vie des personnes suivantes tout le monde à une exception près : un petit obstacle pour s'habituer à quelque chose de nouveau. C'est tout. Il est toujours plus difficile de faire changer quelque chose. Mais la difficulté de changer n'est rien en comparaison de la difficulté de continuer à utiliser &.

L'utilisation de ; comme séparateur de chaîne de requête simplifie grandement les choses. Les séparateurs de type esperluette sont plus de deux fois plus difficiles. pour coder correctement que si des points-virgules étaient utilisés. (Je pense) que la plupart des implémentations ne sont pas codées correctement, donc la plupart des implémentations ne sont pas deux fois plus compliquées. Mais la recherche et la correction des bogues entraînent une perte de productivité. Ici, j'indique deux étapes de codage distinctes nécessaires pour coder correctement une QueryString lorsque & est le séparateur :

  • Étape 1 : L'URL code les clés et les valeurs de la chaîne de recherche.
  • Étape 2 : Concaténer les clés et les valeurs comme 'a=1&b=2' après qu'elles aient été codées par URL à l'étape 1.
  • Etape 3 : Ensuite, le HTML encode la QueryString entière dans la source HTML de la page.

Ainsi, un encodage spécial doit être effectué deux fois pour un encodage correct (sans bogue) des URL, et non seulement cela, mais les encodages sont deux types d'encodage distincts et différents. Le premier est un encodage URL et le second est un encodage HTML (pour le code source HTML). Si l'un d'entre eux est incorrect, alors je peux vous trouver un bug. Mais l'étape 3 est différente pour XML. Pour XML, l'encodage des entités de caractères XML est nécessaire à la place (ce qui est presque identique). Ce que je veux dire, c'est que le dernier encodage dépend du contexte de l'URL, que ce soit dans une page Web HTML ou dans une documentation XML.

Maintenant, avec les séparateurs de point-virgule, beaucoup plus simples, le processus est tel que l'on peut s'y attendre :

  • 1 : Les URL codent les clés et les valeurs,
  • 2 : concaténer les valeurs ensemble. (Sans codage pour l'étape 3).

Je pense que la plupart des développeurs web sautent l'étape 3 parce que les navigateurs sont si indulgents. Mais cela conduit à des bugs et à plus de complications lors de la recherche de ces bugs ou à des utilisateurs qui ne peuvent pas faire certaines choses si ces bugs ne sont pas présents, ou à la rédaction de rapports de bugs, etc.

Une autre complication dans l'utilisation réelle est l'écriture de balises de documentation XML dans mon code source en C# et VB.NET. Puisque & doit être encodé, c'est un véritable frein, littéralement, à ma productivité. Cette étape supplémentaire rend également la lecture du code source plus difficile. Ce déficit de lisibilité s'applique donc non seulement au HTML et au XML, mais aussi à d'autres applications comme le code C# et VB.NET, car leur documentation utilise la documentation XML. La complication de l'encodage de l'étape 3 se propage donc à d'autres applications également.

En résumé, l'utilisation du ; comme séparateur est simple parce que le processus (correct) lors de l'utilisation du point-virgule est celui que l'on attend normalement : une seule étape de codage doit avoir lieu.

Peut-être que ce n'était pas trop confus. Mais toute la confusion ou la difficulté est due à l'utilisation d'un caractère de séparation qui devrait être codé en HTML. Ainsi, '&' est le coupable. Le point-virgule élimine toute cette complication.

(Je tiens à préciser que mon processus en 3 étapes contre 2 étapes ci-dessus est généralement combien d'étapes il faudrait pour le plus applications. Cependant, pour un code totalement robuste, les 3 étapes sont nécessaires, quel que soit le séparateur utilisé. Mais d'après mon expérience, le plus Les implémentations sont bâclées et peu robustes. Ainsi, l'utilisation du point-virgule comme séparateur de chaîne de requête faciliterait la vie d'un plus grand nombre de personnes avec moins de bogues de site web et d'interopérabilité, si tout le monde adoptait le point-virgule comme valeur par défaut au lieu de l'esperluette).

1 votes

Ainsi, dans une certaine mesure, le W3C avait les mains liées en raison de l'héritage de la syntaxe de référence d'entité SGML et du fait que la syntaxe URL était déjà définie ailleurs. Cependant, redéfinir le comportement d'une spécification en dehors de cette spécification est la pire des pratiques pour une interopérabilité efficace. Disons que je suis un implémenteur de spécification. Je lis la spécification, et je l'implémente précisément et parfaitement. Idéalement, je devrais être capable d'interopérer avec toute autre personne qui a fait de même. Mais dès que l'un d'entre nous incorpore les règles supplémentaires, il n'y a plus d'interopérabilité. C'est pourquoi le W3C a tort.

0 votes

Par ailleurs, pour information, le XML dans les commentaires du code source est également assez stupide. Mais ce n'est pas le cas du W3C.

1 votes

@BobAman vous affirmez 'dès que l'un d'entre nous incorpore les règles supplémentaires, il n'y a plus d'interop.' Mais ce n'est pas la vérité. C'est comme dire que si votre serveur utilise POP3 et que mon serveur utilise uniquement IMAP, il n'y a plus d'interopérabilité, donc celui qui a écrit IMAP avait tort. Mec, ça s'appelle ajouter à une technologie avec un meilleur remplacement. La solution au problème de l'IMAP est la même que celle du séparateur ; dans les URL : soyez conscient des deux et utilisez celui que le serveur utilise. Pas de confusion. Vous rendez les choses plus difficiles qu'elles ne le sont. Les anciennes technologies sont dépassées par les nouvelles normes. C'est le cas de celle-ci.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X