URLs sind überall, aber es scheint, dass Entwickler sie nicht wirklich verstehen, weil ich oft Leute sehe, die fragen, wie man eine URL beim Stapelüberlauf korrekt erstellt. Wenn Sie wissen möchten, wie die URL -Syntax funktioniert, können Sie diesen Artikel von Lunatech lesen, was sehr gut ist.
In diesem Artikel wird nicht die gesamte URLs -Syntax eingebracht (wenn Sie URLs vollständig verstehen möchten, können Sie RFC 3986, RFC 1738 und den oben genannten Artikel sowie die obige Dokumentation ob oben W3 lesen). Hier möchte ich über einige gemeinsame Bibliotheken in Betriebs-URLs sprechen und darüber, wie man sie korrekt über URL-Builder verwendet. Dies ist eine Java -Bibliothek, die wir veröffentlicht haben, um URLs korrekt zu erstellen.
Frage 1: Javas Urlencoder
Diese Klasse wird nicht nur schlecht benannt, sondern ihr erster Satz im Dokument ist nicht sehr korrekt.
Versorgungsklasse für HTML -Formcodierung.
Sie fragen sich vielleicht, warum es Urlencoder genannt wird, aber Sie sind völlig sprachlos, wenn Sie diese Zeile sehen.
Wenn Sie den Lunatech -Blog -Beitrag gelesen haben, sollten Sie jetzt verstehen, dass Sie eine URL -Zeichenfolge durch diese Klasse nicht auf wundersame Weise in ein sicheres, korrekt codiertes URL -Objekt konvertieren können. Wenn Sie nicht genug Hausaufgaben gemacht haben, finden Sie hier ein kleines Beispiel, um Ihnen zu helfen.
Angenommen, Sie haben einen HTTP -Dienst Endpoint http://foo.com/search, der einen Abfrageparameter P akzeptiert, und der Wert von P ist die durchsuchende Zeichenfolge. Wenn Sie nach der Zeichenfolge "You & I" suchen, könnte die URL der Suche, die Sie zum ersten Mal erstellt haben, wie folgt: http://foo.com/search?q=you & I. Natürlich funktioniert dies nicht, da und ist das Trennzeichen, das die Parameter -Parameter -Parameterpaare von Abfragen trennt. Wenn Sie diese unordentliche URL -Zeichenfolge erhalten, sind Sie hilflos, weil Sie sie zunächst nicht richtig analysieren können.
OK, verwenden wir Urlencoder. Urlencoder.encode ("du & i", "utf-8") ist das Ergebnis, dass du+%26+i. Nach dem Dekodieren dieses %26 ist es & und das + Zeichen repräsentiert Räume in der Abfragezeichenfolge, sodass diese URL normal funktionieren kann.
Nehmen wir nun an, Sie möchten Ihre Abfragezeichenfolge verwenden, um den URL -Pfad zu spleißen, anstatt ihn in die URL -Parameter zu setzen. Offensichtlich ist http://foo.com/search/you & ich falsch. Leider ist auch das Ergebnis von urlencoder.encode () falsch. http://foo.com/search/you+%26+i wird/suche/Sie+&+i, da das+Zeichen nicht auf Leerzeichen im URL -Pfad aufgelöst wird.
Urlencoder kann einige Ihrer Szenarien erfüllen. Leider erleichtert der übermäßig generische Name es den Entwicklern leicht, ihn zu missbrauchen. Der beste Weg ist daher nicht, es zu verwenden, damit andere Entwickler bei der Verwendung anderer Funktionen auf Ihrer Basis Fehler machen (es sei denn, Sie machen wirklich "HTML -Formcodierung").
Frage 2: Groovy Httpbuilder und Javas URI
HTTP Builder ist eine HTTP -Client -Bibliothek von Groovy.
Das Erstellen einer normalen Get -Anfrage ist sehr einfach:
New HttpBuilder ("http: // localhost: 18080") .Request (method.get) {uri.path = "/foo"}Dieser Code sendet GET /Foo HTTP /1.1 an den Server (Sie können NC -L -P 18080 ausführen und diesen Code dann ausführen, um ihn zu überprüfen).
Versuchen wir die URL, die Räume enthält.
New HttpBuilder ("http: // localhost: 18080") .Request (method.get) {uri.path = "/foo bar"}Dies sendet Get /Foo%20Bar HTTP /1.1, was ziemlich gut aussieht.
Nehmen wir nun an, es gibt einen Abschnitt auf unserem Weg namens Foo/Bar. Dies kann nicht einfach durch Senden von Foo/Bar geschehen, da dies als zwei Segmente auf dem Weg, Foo und Bar angesehen wird. Versuchen wir es mit Foo%2fbar (ersetzen / durch die entsprechende Codierung).
New HttpBuilder ('http: // localhost: 18080') .Request (method.get) {uri.path = '/foo%2fbar'}Dies sendet Get /Foo%252FBAR HTTP /1.1. Das ist nicht sehr gut. %in %2f wird wiederholt codiert, sodass der nach dem Dekodieren erhaltene Pfad Foo %2fbar anstelle von foo/bar ist. Die Realität, die hier verantwortlich ist, ist java.net.uri, weil die Uribuilder -Klasse in httpbuilder es verwendet.
Der Typ der URI -Eigenschaft, die in der Konfigurationsschließung im obigen Code aufgedeckt wurde, ist der Uribuilder. Wenn Sie die Pfadeigenschaft des URI über Uri.Path =… aktualisieren, wird schließlich einen Konstruktor des URI angerufen. Diese Methode beschreibt die Eigenschaft eingehender Pfad wie folgt:
Wenn der Pfadparameter bereitgestellt wird, wird er an die URL angehängt. Die Charaktere im Pfad sind so lange codiert, wie sie nicht nicht reservierte, unterbrochene, entkommene und andere Kategorien sind (Anmerkung des Übersetzers: Diese Kategorien sind in RFC 2396 beschrieben) und sind nicht/oder @ Nummern.
Dieser Ansatz ist nicht sehr aussagekräftig, denn wenn der Text vor der Codierung spezielle Zeichen enthält, kann er kein korrekt codiertes Pfadsegment erzeugen. Mit anderen Worten: "Ich werde diese Zeichenfolge codieren, und nach der Codierung ist sie richtig", was natürlich ein Trugschluss ist, und URI ist zufällig ein Opfer dieses Irrtums. Wenn die Zeichenfolge korrekt codiert wurde, gibt es kein Problem. Wenn nicht, wird dies geschehen, weil die Zeichenfolge nicht analysiert werden kann. In der Tat entkommt die Dokumentation nicht der / bedeutet, dass die Pfadfolge korrekt codiert wurde (dh sie wird korrekt verwendet, um die Pfade zu trennen) und sie nicht korrekt codiert (die anderen Teile, außer / müssen noch codiert werden).
Es wäre großartig, wenn HttpBuilder diese defekte Funktion der URI -Klasse nicht verwendet. Natürlich wäre es noch besser, wenn es dem URI selbst in Ordnung ist.
Die richtige Art, es zu tun
Wir haben diesen URL-Builder geschrieben, der den Entwicklern helfen kann, verschiedene Arten von URLs leicht zu spleißen. Es folgt den Codierungsspezifikationen in den Referenzmaterialien zu Beginn des Artikels und bietet auch eine Streaming -API. Das folgende Nutzungsbeispiel kann fast alle Nutzungsszenarien abdecken:
Urlbuilder.forhost ("http", "foo.com") .PathSegment ("mit Räumen") .PathSegmente ("Pfad", "mit", "varargs") .PathSegment ("& =?/") .Queryparam ("Fancy + Name", "Fancy? = Value". .tourlstring ()Das Ergebnis ist: http://foo.com/with%20spaces/path/with/varargs/&=%3f%2f;matrix=param%3f?fancy%20%2B%20Name=fancy?%3Dvalue#%23?=
Dieses Beispiel zeigt verschiedene Codierungsregeln für jeden Teil der URL. Zum Beispiel ist der nichtcodierte & = auf dem Pfad zulässig, während?/ Muss codiert werden, aber die = muss in den Abfrageparametern codiert werden, aber die? Die Nummer braucht es nicht, da dies bereits Teil der Abfragebarstellung ist (Anmerkung des Übersetzers: Die Abfragezeichenfolge beginnt mit einer Nummer, sodass sie danach eine Zahl enthalten kann).
Danke fürs Lesen, ich hoffe, es kann Ihnen helfen. Vielen Dank für Ihre Unterstützung für diese Seite!