2015-09-17 3 views
1

J'espère pouvoir expliquer cela de manière logique!Trouver le chemin correspondant dans le service Web de Clojure

J'utilise Libérateur de prototype certains services web que je dois exposer aux clients et ont voie (s) définis comme ceci:

(defroutes fish 
    (context "/fish" 
      [] 
      (ANY "/cod/:id/count" 
       [id] 
       (cod-fish id)))) 

(def handler 
    (-> fish 
     wrap-params 
     path-wrapper)) 

L'intention de path-wrapper est de sortie des informations sur la correspondance chemin. Il ressemble actuellement à ceci:

(defn path-wrapper 
    [handler] 
    (fn [request] 
    (println "in" (:request-method request) (:uri request)) 
    (let [response (handler request)] 
     (println "out") 
     response))) 

Ceci affiche ce que vous attendez:

in :get /fish/cod/123/count 
out 

Cependant, ce que je voudrais qu'il imprimer est:

in :get /fish/cod/:id/count 
out 

Ce est le chemin qui correspond plutôt que l'URI correspondant.

Je suis presque certain que la réponse est dans Clout quelque part mais je ne semble pas capable de le trouver! :(

Tous les conseils

Cheers,

Peter

Répondre

0

Dans des cas comme cela, je suis friand de mettre dans une déclaration de débogage comme:

(let [response .... ] 
    (log/errorf "in: request was: %s" 
     (with-out-str (clojure.pprint/pprint request)) 
.... 

et chercher les données que vous voulez dans la sortie (puis supprimez l'instruction) ou si vous avez un environnement de travail et emacs + cidre moderne, vous pouvez ajouter le débogage à la fonction avec C-C-cC-c et d'attraper la valeur de la demande de cette façon. Si les données que vous voulez ne sont pas disponibles, elles seront probablement dans cette sortie. Si vous n'utilisez pas d'infrastructure de journalisation, supprimez les parties log et with-out-str et appelez simplement pprint directement.

Désolé si je suis malentendu ou est peut-être est-une faute de frappe dans la question que:

(let [response handler] 
     (println "out") 
     response) 

ressemble il est de retour le gestionnaire lui-même plutôt que le résultat de l'appel de ce gestionnaire, doit-il être:

(let [response (handler request)] 
     (println "out") 
     response) 
+0

pour répondre à votre deuxième point; oui, cela aurait dû être un appel à 'handler' plutôt que le gestionnaire lui-même - merci. – peter