Les URL sont partout, mais il semble que les développeurs ne les comprennent pas vraiment, car je vois souvent des gens demander comment créer une URL correctement sur le débordement de la pile. Si vous voulez savoir comment fonctionne la syntaxe d'URL, vous pouvez lire cet article de Lunatech, ce qui est très bon.
Cet article ne présentera pas toute la syntaxe des URL en profondeur (si vous souhaitez bien comprendre les URL, vous pouvez lire RFC 3986, RFC 1738, et l'article mentionné ci-dessus, ainsi que la documentation ci-dessus W3). Ici, je veux parler de certaines bibliothèques communes dans les URL de fonctionnement et comment l'utiliser correctement via URL-Builder. Il s'agit d'une bibliothèque Java que nous avons publiée pour créer correctement les URL.
Question 1: Urlencoder de Java
Non seulement cette classe est mal nommée, mais sa première phrase dans le document n'est pas très correcte.
Classe d'utilité pour l'encodage du formulaire HTML.
Vous vous demandez peut-être pourquoi cela s'appelle Urlencoder, mais vous êtes complètement sans voix lorsque vous voyez cette ligne.
Si vous avez lu le billet de blog Lunatech, vous devez maintenant comprendre que vous ne pouvez pas convertir miraculeusement une chaîne d'URL en un objet URL sûr et correctement codé à travers cette classe. Bien sûr, si vous n'avez pas fait suffisamment de devoirs, voici un petit exemple pour vous aider à comprendre.
Supposons que vous ayez un point de terminaison de service HTTP http://foo.com/search, qui accepte un paramètre de requête P, et la valeur de P est la chaîne à rechercher. Si vous recherchez la chaîne "vous & i", l'URL de la recherche que vous avez créée pour la première fois pourrait être ceci: http://foo.com/search?q=ou & I. Bien sûr, cela ne fonctionnera pas, car et est le séparateur qui sépare les paires de noms / valeur du paramètre de requête. Si vous obtenez cette chaîne d'URL désordonnée, vous êtes impuissant car tout d'abord, vous ne pouvez pas l'analyser correctement.
Ok, utilisons UrlenCcoder. UrLencoder.Encode ("You & I", "UTF-8") est le résultat que vous +% 26 + i. Après le décodage de ce% 26, c'est et, et le signe + représente les espaces dans la chaîne de requête, donc cette URL peut fonctionner normalement.
Supposons maintenant que vous souhaitiez utiliser votre chaîne de requête pour épisser le chemin d'URL au lieu de le mettre dans les paramètres d'URL. De toute évidence, http://foo.com/search/you & i a tort. Malheureusement, le résultat d'UrLencoder.Encode () est également faux. http://foo.com/search/you+%26+i obtiendra / search / you + & + i, car le signe + ne résoudra pas aux espaces dans le chemin d'URL.
Urlencoder peut satisfaire à certains de vos scénarios. Malheureusement, son nom trop générique permet aux développeurs de l'utiliser facilement. Par conséquent, la meilleure façon est de ne pas l'utiliser, afin que d'autres développeurs fassent des erreurs lorsque vous utilisez d'autres fonctions sur votre base (sauf si vous faites vraiment "codage de formulaire HTML").
Question 2: Groovy HttpBuilder et Java's Uri
HTTP Builder est une bibliothèque client HTTP de Groovy.
La création d'une demande de GET normale est très simple:
Nouveau httpbuilder ("http: // localhost: 18080") .request (méthode.get) {uri.path = "/ foo"}Ce code enverra GET / FOO HTTP / 1.1 au serveur (vous pouvez exécuter NC -L -P 18080, puis exécuter ce code pour le vérifier).
Essayons les espaces contenant l'URL.
Nouveau httpbuilder ("http: // localhost: 18080") .request (méthode.get) {uri.path = "/ foo bar"}Cela envoie Get / Foo% 20bar HTTP / 1.1, ce qui a l'air plutôt bien.
Supposons maintenant qu'il y ait une section sur notre chemin appelé foo / bar. Cela ne peut pas être fait simplement en envoyant FOO / BAR, car cela sera considéré comme deux segments dans le chemin, foo et bar. Essayons Foo% 2FBAR (Remplacer / par le codage correspondant).
Nouveau httpbuilder ('http: // localhost: 18080') .request (méthode.get) {uri.path = '/ foo% 2fbar'}Cela envoie Get / Foo% 252fbar http / 1.1. Ce n'est pas très bon. Le% en% 2F est codé à plusieurs reprises, donc le chemin obtenu après le décodage est FOO% 2FBAR au lieu de FOO / BAR. La vraie chose à blâmer ici est java.net.uri, car la classe Uribuilder de HttpBuilder l'utilise.
Le type de la propriété URI exposée dans la fermeture de configuration dans le code ci-dessus est uribuilder. Si vous mettez à jour la propriété Path de l'URI via uri.path =…, il appellera éventuellement un constructeur de l'URI. Cette méthode décrit la propriété de chemin entrant comme suit:
Si le paramètre de chemin est fourni, il est ajouté à l'URL. Les personnages du chemin sont codés tant qu'ils ne sont pas non réservés, ponctués, échappés et autres catégories (Note du traducteur: ces catégories sont détaillées dans RFC 2396), et ne sont pas / ou @ nombres.
Cette approche n'est pas très significative, car si le texte avant le codage contient des caractères spéciaux, il ne peut pas générer un segment de chemin correctement codé. En d'autres termes, "je coderai cette chaîne, et après son encodage, c'est correct", qui est bien sûr une erreur, et Uri se trouve être une victime de cette erreur. Si la chaîne a été codée correctement, il n'y a pas de problème. Sinon, cela sera fait car la chaîne ne peut pas être analysée. En fait, ce que la documentation dit n'échappe pas au / signifie qu'il suppose que la chaîne de chemin a été correctement codée (c'est-à-dire qu'elle est correctement utilisée pour séparer les chemins), et elle n'a pas été correctement codée (les autres parties sauf / doivent être encodées).
Ce serait formidable si HttpBuilder n'utilise pas cette fonction défectueuse de la classe URI. Bien sûr, ce serait encore mieux si l'URI lui-même va bien.
La bonne façon de le faire
Nous avons écrit ce constructeur d'URL, qui peut aider les développeurs à épisser facilement divers types d'URL. Il suit les spécifications de codage dans les documents de référence au début de l'article, et il fournit également une API de streaming. L'exemple d'utilisation suivant peut couvrir presque tous les scénarios d'utilisation:
Urlbuilder.forHost ("http", "foo.com") .pathsegment ("avec espaces") .pathSegments ("path", "avec", "varargs") .pathsegment ("& =? /") .Queryparam ("sophone + nom", "fantaisie? = Valeur") .matrixParam ("Matrix", "param?)"). .Fragment ("#? =") .tourlString ()Le résultat est: http://foo.com/with%20spaces/path/with/varargs/&=%3F%2F;Matrix=Param%3F?fancy%20%2B%20Name=fancy?%3DValue#%23?=
Cet exemple démontre différentes règles d'encodage pour chaque partie de l'URL. Par exemple, le non codé & = dans le chemin est autorisé, tandis que? / Doit être codé, mais le = doit être codé dans les paramètres de requête, mais le? Le numéro n'en a pas besoin, car cela fait déjà partie de la chaîne de requête (Note du traducteur: La chaîne de requête commence par un numéro?, afin qu'il puisse inclure un numéro? après).
Merci d'avoir lu, j'espère que cela peut vous aider. Merci pour votre soutien à ce site!