2012-10-20 16 views
6

My Compojure aplikacja internetowa ([compojure "1.0.1"]) zawsze otrzymuje pusty parametru mapę, pomimo dodawania oblewania-params itp przykładowy kod poniżej:trasa Compojure params pusty

(defroutes public-routes 
    (PUT "/something" {params :params} 
     (println (str "Params: " params)) 
     (do-put-something params))) 

(def myapp 
    (-> public-routes 
     ring-params/wrap-params)) 

(defn start-server [] 
    (future (jetty/run-jetty (var myapp) {:port 8080}))) 

próbowałem dodajemy parametry-wrap, paramy-słowa-klucze-params i -parametry-wieloczęściowe, ale kiedy ustawię w punkcie końcowym używając httpie (lub mojego klienta), stwierdzam, że paramemy są zawsze puste. Czy ktoś może pomóc?

Dzięki!

+2

Aby ustalić, czy problem jest w compojure Route-definicji lub w params nie są wyodrębnione przez zakańczania params, mogę polecić, że tymczasowo '(defn public-routes [req] (println req))' dzięki czemu można zobaczyć całą mapę żądania Ring? –

Odpowiedz

1

Jedyny problem z przykładowym kodem polegał na tym, że brakuje mu mapy mieszającej odpowiedzi pierścienia w treści trasy. Rozwiązanie jest oceniane na odpowiedź pierścienia, zamiast używać println. Gdy wywołujesz println na trasie, wyprowadza on standardowe wyjście tam, gdzie działa proces serwera, który nie ma nic wspólnego z odpowiedzią na wywołanie API.

(defroutes public-routes 
    (PUT "/something" {params :params} 
    {:status 200 
    :body (str "Params: " params)})) 

To daje odpowiedź 200 z Params: {"foo" "bar"} jako treścią odpowiedzi.

używam tego, aby przetestować swoją trasę PUT:

curl -X PUT -d "foo=bar" http://127.0.0.1:8080/something 
+0

Mogę nadal robić to źle, ale obawiam się, że ten pierwszy daje mi błąd czasu kompilacji, ten drugi tworzy taką samą pustą kolekcję params. – jamiei

+0

Czy możesz zamieścić minimalny pełny projekt jako istotę lub repozytorium git? – rplevy

+0

https://gist.github.com/1f74b817ca5d306af9f3 – jamiei