2013-04-06 8 views
5

Ich möchte eine Ressource in Compojure wie folgt definieren:Compojure: optional URL-Parameter

(ANY "myres/:id" [id] (handler)) 

und ich möchte das: id optional sein (abhängig davon, ob oder nicht die ID ist mein API angegeben wird anders verhalten).

Dies funktioniert ok, wenn ich

http://mydomain/myres/12 

jedoch zuzugreifen versuchen, wenn ich

http://mydomain/myres 

ohne eine ID-Angabe zuzugreifen versuchen, erhalte ich 404.

Gibt es eine Möglichkeit zu habe der Parameter: id, um optional zu sein?

Danke!

Antwort

8

Was zwei anderen Weges einen mit der ID über das Erstellen und eine andere, ohne sie und Handler von beide Route Aufruf wie folgt:

(defn handler 
    ([] "Response without id") 
    ([id] (str "Response with id - " id))) 

(defroutes my-routes 
    (ANY "myres" [] (handler)) 
    (ANY "myres/:id" [id] (handler id))) 
+0

Vielen Dank für Ihre Lösung, die ich auf jeden Fall gelten! Es ist eine Schande, dass der Parameter: id standardmäßig nicht als optional betrachtet wird. Ich mag die Idee nicht, zwei Routen zu definieren, besonders wenn ich viele Ressourcen nach dem gleichen Muster habe :( –