23 votes

Comment analyser les paramètres d'une URL en Clojure ?

Si j'ai la demande "size=3&mean=1&sd=3&type=pdf&distr=normal" quelle est la façon idiomatique d'écrire la fonction (defn request->map [request] ...) qui prend en compte cette demande et renvoie une carte {:size 3, :mean 1, :sd 3, :type pdf, :distr normal}

Voici ma tentative (en utilisant clojure.walk et clojure.string) :

(defn request-to-map
   [request]
   (keywordize-keys
      (apply hash-map
             (split request #"(&|=)"))))

J'aimerais savoir comment d'autres personnes résoudraient ce problème.

0voto

stereo_future Points 1

J'ai rencontré cette question lors de la construction de mon propre site et la réponse peut être un peu différente, et plus facile, si vous passez des paramètres en interne.

Utilisation de Secretary pour gérer le routage : https://github.com/gf3/secretary

Les paramètres sont automatiquement extraits vers une carte dans :query-params lorsqu'une correspondance d'itinéraire est trouvée. L'exemple donné dans la documentation :

(defroute "/users/:id" [id query-params]
  (js/console.log (str "User: " id))
  (js/console.log (pr-str query-params)))

(defroute #"/users/(\d+)" [id {:keys [query-params]}]
  (js/console.log (str "User: " id))
  (js/console.log (pr-str query-params)))

;; In both instances...
(secretary/dispach! "/users/10?action=delete")
;; ... will log
;; User: 10
;; "{:action \"delete\"}"

0voto

thepanuto Points 754

Vous pouvez utiliser ring.middleware.params . Voici un exemple avec aleph :

user=> (require '[aleph.http :as http])
user=> (defn my-handler [req] (println "params:" (:params req)))
user=> (def server (http/start-server (wrap-params my-handler)))

wrap-params crée une entrée dans la base de données request objet appelé :params . Si vous voulez que les paramètres de la requête soient des mots-clés, vous pouvez utiliser ring.middleware.keyword-params . Veillez à l'emballer avec wrap-params d'abord :

user=> (require '[ring.middleware.params :refer [wrap-params]])
user=> (require '[ring.middleware.keyword-params :refer [wrap-keyword-params])
user=> (def server 
         (http/start-server (wrap-keyword-params (wrap-params my-handler))))

Cependant, il faut savoir que cela implique une dépendance à l'égard de ring .

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