2015-04-16 5 views
2

J'utilise Liberator, et j'ai du mal à obtenir mes données POSTed dans une carte en utilisant des mots-clés comme clés. Voici ma ressource, avec quelques PRINTLINES pour les tests:Obtenir une carte clojure avec des mots-clés à partir d'un POST en utilisant Liberator

(defresource finish_validation 
      :allowed-methods [:post] 
      :available-media-types ["application/json"] 
      :post! (fn [context] 
         (let [params (slurp (get-in context [:request :body])) 
          mapped_params (cheshire/parse-string params)] 

         (println (type params)) 
         (println (type mapped_params)) 
         (validation/finish mapped_params))) 
      :handle-created (println)) 

Pour les tests, je suis l'affichage des données à l'aide Ondulations:

curl -H "Content-Type: application/json" -X POST -d '{"email":"[email protected]","code":"xyz"}' http://localhost:8080/validate 

convertit les cheshire params dans une carte, mais les touches sont pas les mots-clés: je reçois {email [email protected], code xyz} comme la sortie, au lieu de l'espéré {:email [email protected], :code xyz}.

Dois-je faire quelque chose différemment? Est-ce la bonne approche pour obtenir les données?

Répondre

1

Je viens de mettre « vrai » à la fin de l'appel à la fonction cheshire, et les clés sont retournées comme mots-clés:

(cheshire/parse-string params true) 
+0

Je recommande d'utiliser les middleware 'wrap-keyword-params' et' wrap-params' de l'anneau. Ceci est beaucoup plus sec, car vous devrez analyser les paramètres pour chaque décision dans le libérateur. Alors qu'avec le middleware en anneau, ceci est fait pour chaque requête. Donc déjà converti et accessible dans chaque décision. – Seth

0

En fonction de vos besoins, vous pouvez simplifier la gestion de votre publier des données à l'aide de divers intergiciels en anneau. Cela vous permettra de traiter vos données json en un seul endroit et d'éliminer le besoin de dupliquer le traitement des données dans chacune de vos définitions de gestionnaires/ressources. Il y a plusieurs façons de le faire. Vous pouvez ajouter les données json en tant que paramètres avec mots-clés dans la carte params ou dans une carte json-params. Jetez un oeil à ring.middleware.format et ring.middleware.json.

+0

J'ai essayé, mais le middleware n'affecte pas les données que je suis en train de digérer à partir des résultats du contexte Liberator. – pickwick

+0

L'avantage de l'approche middleware est que vous n'avez pas à filtrer les données du corps de la réponse. Le middleware anneau prendra soin de cela pour vous. Vous pouvez simplement obtenir les params de la carte qui est déjà dans le contexte liberator. –

0

Vous devez tirer parti du middleware wrap-params de l'anneau, associé au middleware wrap-keyword-params qui convertit la carte params en carte-clé.

(ns your.namespace 
    (:require [ring.middleware.params :refer [wrap-params]] 
      [ring.middleware.keyword-params :refer [wrap-keyword-params]])) 

(def app 
    (-> some-other-middleware 
     wrap-keyword-params 
     wrap-params)) 

En utilisant ce middleware avec wrap-params convertit params d'utiliser des clés. Après avoir ajouté ce middleware, vous pouvez accéder à vos paramètres à partir de la carte de requête, comme par exemple (-> ctx :request :params). Pas besoin de les convertir par requête. Cela va gérer toutes les demandes.