2015-09-17 3 views
1

Надеюсь, я могу объяснить это так, чтобы это имело смысл!Поиск совпадающего пути в веб-сервисе Clojure

Я использую Освободителя прототип некоторые веб-сервисы, которые мне нужно подвергать клиентов и иметь маршрут (ы), определенные как так:

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

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

Намерение path-wrapper: вывести информацию о согласованный дорожка. В настоящее время она выглядит так:

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

Это печатает то, что вы ожидали бы:

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

Однако то, что я хотел бы, чтобы распечатать это:

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

Это это путь, который соответствовал, а не URI, который соответствовал ему.

Я почти уверен, что ответ находится в Clout где-то, но я не могу его найти! :(

Любые советы

Cheers,

Питер

ответ

0

В таких случаях я люблю положить в отладке заявления как:

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

и ищет данные, которые вы хотите на выходе (затем удалить оператор), или если у вас есть рабочая и современная среда emacs + cider, вы можете добавить отладку в функцию с помощью C- uC-cC-c и поймать значение запроса таким образом. Если данные, которые вы не доступны, вероятно, будут в этом выпуске. Если вы не используете фреймворк регистрации, то удалите разделы журнала и без вывода и просто вызовите pprint напрямую.

Извините, если я недоразумение или, возможно, есть опечатка в вопросе, хотя:

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

похоже, что возвращается сам обработчик, а не результат вызова этого обработчика, оно должно быть:

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

ответить на ваш второй пункт; да, это должен был быть вызов 'handler', а не самого обработчика - спасибо. – peter