Wie parse URL-Parameter in Clojure?
Wenn ich die Anfrage "size=3&mean=1&sd=3&type=pdf&distr=normal"
was ist die idiomatische Schreibweise für die Funktion (defn request->map [request] ...)
nimmt diese Anfrage und
gibt eine Karte {:size 3, :mean 1, :sd 3, :type pdf, :distr normal}
Hier ist mein Versuch (mithilfe von clojure.zu Fuß und clojure.string):
(defn request-to-map
[request]
(keywordize-keys
(apply hash-map
(split request #"(&|=)"))))
Ich bin daran interessiert, wie andere dieses problem lösen würde.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie dies leicht tun mit einer Anzahl von Java-Bibliotheken. Ich würde zögern, zu versuchen, zu Rollen, meine eigene parser, es sei denn, ich lese die URI-Spezifikationen sorgfältig und sicher, dass ich fehlte nicht alle Sonderfälle (z.B. Parameter, die in der Abfrage zweimal mit unterschiedlichen Werten). Dies nutzt jetty-util:
Angenommen, Sie möchten, analysieren von HTTP-request-query-Parametern, warum nicht ring? ring.middleware.params enthält, was Sie wollen.
Die Funktion für parameter-Extraktion geht so:
Mit
form-decode
undkeywordize-keys
:Deins sieht gut aus. Ich neigen dazu, übernutzung regexes, so hätte ich es gelöst, wie
Bearbeiten: versuchen Sie zu bleiben Weg von clojure.zu Fuss allerdings. Ich glaube nicht, dass es offiziell nicht mehr, aber es ist nicht sehr gut gepflegt. (Ich benutze es viel, auch wenn, so fühlen sich nicht schlecht).
into...for
undre-seq
.Können auch verwenden diese Bibliothek für beide, clojure und clojurescript: https://github.com/cemerick/url
Stieß ich auf diese Frage beim Aufbau meiner eigenen Website und die Antwort kann ein bisschen anders und leichter, wenn Sie die übergabe von Parametern intern.
Mit Sekretär routing: https://github.com/gf3/secretary
Parameter werden automatisch extrahiert, um eine Karte in :query-Parameter, wenn eine route übereinstimmung gefunden wird. Das Beispiel in der Dokumentation:
Können Sie
ring.middleware.params
. Hier ist ein Beispiel mitaleph
:wrap-params
erstellt einen Eintrag in derrequest
Objekt namens:params
. Wenn Sie möchten, dass die Abfrage-Parameter als Schlüsselwörter, die Sie verwenden könnenring.middleware.keyword-params
. Werden Sie sicher, wrap mitwrap-params
erste:Jedoch bewusst sein, dass dies auch eine Abhängigkeit von
ring
.