2013-05-23 8 views
6

org.clojure/clojure-contrib "1.2.0" anello "1.1.8" compojure "1.1.5" peso "1.1.0"Come si accede: le intestazioni all'interno funzione compojure

(defroutes rest-routes 
    (GET "/" [] "<p> Hello </p>") 
    (POST "/api/v1/:stor/sync" [stor] (start-sync stor)) 
    (POST ["/api/v1/:stor/:txn/data/:file" :file #".*"] [stor txn file] (txn-add stor txn file)) 
    (ANY "*" [] "<p>Page not found. </p>")) 

Nel secondo POST, voglio anche passare tutti gli header http al gestore "txn-add". Ho fatto un sacco di google e ho cercato nel codice, ma non ho trovato nulla di utile.

so, posso utilizzare il seguente per passare le intestazioni (ma poi non analizza richiesta URL),

(POST "/api/v1" 
    {headers :headers} (txn-add "dummy stor" "dummy txn" headers)) 

Inoltre, come faccio a passare il contenuto (ad esempio: il corpo) di richiesta POST a "txn-add"?

+0

Se avete trovato la soluzione assicuratevi di segnare la risposta corretta. – Ankur

risposta

8

Se il secondo argomento di GET, POST etc non è un vettore, è un modulo vincolante destrutturante per request. Ciò significa che si possono fare cose come:

(GET "/my/path" 
    {:keys [headers params body] :as request} 
    (my-fn headers body request)) 

di individuare le parti di request che si desidera. Vedere the Ring SPEC e Clojure's docs on binding & destructuring

+0

Sono un po 'nuovo per il clojure nel suo complesso (sono appena passate due settimane da questo). Pertanto, non sono sicuro se ho capito la tua risposta. Tuttavia, ho bisogno di analizzare la parte "url" per [stor txn file] e quindi ho bisogno di passare: anche le intestazioni in '(POST ["/api/v1 /: stor /: txn/data /: file ": file # ". *"] [stor txn file] (txn-add stor txn file)) '. Quindi, ho bisogno di una combinazione di argomenti vettoriali e forma vincolante di destrutturazione, come ottenere quello –

6

La mappa richiesta intera può essere specificato in binding utilizzando :as parola chiave in attacchi e poi utilizzato per leggere le intestazioni o del corpo:

(POST ["/api/v1/:stor/:txn/data/:file" :file #".*"] 
     [stor txn file :as req] 
     (my-handler stor txn file req)) 
+0

grazie. Ha fatto la magia (comunque è ancora una magia nera per me, dato che non riesco a capirlo guardando il codice compojure su github). Ora, sono in grado di passare tutti i parametri (url compnonents e headers) al gestore. –

+0

Controlla https://github.com/weavejester/compojure/blob/master/src/compojure/core.clj#L66 per come vengono gestite le associazioni – Ankur

+0

Grazie Ankur. Guardando all'implementazione di "legami vettoriali", ora mi sono chiaro come funziona tutto. –

Problemi correlati