2016-02-23 2 views
1

je quelque chose comme ça (GET "/photo/:id/tags/:tag-id/...")Typecast id de route compojure en entier automatiquement

et donc pour chaque itinéraire dans ce contexte, je dois typer ces ids en entier explicitement. Existe-t-il un moyen d'y parvenir automatiquement ou d'avoir un lieu commun pour identifier les identifiants au lieu de l'action de chaque contrôleur?

Répondre

2

Au Compojure 1.4.0, vous pouvez également fournir des fonctions de coercition pour les paramètres en utilisant le: < < mot-clé:

[x :<< as-int] 

Dans le cas ci-dessus, le paramètre x sera transmis par la fonction-int avant d'être affecté. Si une fonction de coercition renvoie zéro, la contrainte est considérée comme ayant échoué et la route ne correspondra pas.

Exemple:

(defroutes app 
    (GET "/customers" [] customers) 
    (GET "/suppliers" [] suppliers) 
    (GET "/accounts" [] accounts) 
    (context "/statements" [] 
      (GET "/" [] statements) 
      (GET "/:id" [id :<< as-int] (single-statement id)))) 
3

Vous pouvez obtenir ce comportement en utilisant compojure-api où vous pouvez spécifier les types de schéma pour les paramètres d'URL/requête ainsi que le corps de la requête. For example:

(defapi app 
    (GET "/photo/:id" [] 
    :path-params [id :- Long] 
    (ok {:message (str "Photo with ID " id)}))) 

En spécifiant [id :- Long] vous demande de faire une contrainte de chemin id type Long param.