2013-05-23 7 views
6

org.clojure/clojure-योगदान "1.2.0" अंगूठी "1.1.8" compojure "1.1.5" प्रभाव "1.1.0"कैसे आप तक पहुँचने के लिए: 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>")) 

दूसरे पोस्ट में, मैं सभी http-headers को "txn-add" हैंडलर में भी पास करना चाहता हूं। मैंने बहुत सारे Google को किया और कोड को देखा, लेकिन कुछ भी उपयोगी नहीं मिला।

मुझे पता है, मैं हेडर पारित करने के लिए उपयोग कर सकते हैं निम्नलिखित (लेकिन तब यह यूआरएल अनुरोध पार्स नहीं करता है),

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

इसके अलावा, मैं कैसे सामग्री पारित है: POST अनुरोध का (यानी शरीर) "txn-add" करने के लिए?

+0

सही बात। – Ankur

उत्तर

8

यदि जीईटी, पोस्ट आदि के लिए दूसरा तर्क वेक्टर नहीं है, तो यह request के लिए एक विनाशकारी बाध्यकारी रूप है। इसका मतलब है कि आप की तरह कर सकते हैं:

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

request के कुछ हिस्सों आप चाहते हैं चुनने के लिए। the Ring SPEC देखें और Clojure's docs on binding & destructuring

+0

मैं पूरी तरह से क्लोजर के लिए कुछ नया हूं (बस इसमें दो सप्ताह हुए हैं)। इसलिए, सुनिश्चित नहीं है कि मैं आपका जवाब समझ गया हूं। हालांकि, मुझे [stor txn फ़ाइल] के लिए "url" भाग को पार्स करने की आवश्यकता है और फिर पास करने की आवश्यकता है: शीर्षलेखों के साथ-साथ '(POST ["/ api/v1 /: stor /: txn/data /: file": file # "। *"] [stor txn फ़ाइल] (txn-add stor txn फ़ाइल)) '। इसलिए, मुझे –

6

पूरे अनुरोध नक्शा बाइंडिंग में :as कीवर्ड का उपयोग बाइंडिंग में निर्दिष्ट किया जा सकता है और फिर हेडर या शरीर को पढ़ने के लिए प्रयोग किया है: आप समाधान जवाब को चिह्नित करने के लिए सुनिश्चित करें मिला है, तो

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

धन्यवाद प्राप्त करने के लिए, वेक्टर तर्क और विनाशकारी बाध्यकारी रूप के संयोजन की आवश्यकता है। यह जादू करता था (हालांकि यह अभी भी मेरे लिए एक काला जादू है, क्योंकि मैं इसे जिथूब पर कंपोज़र कोड के माध्यम से देखकर नहीं समझ सकता था)। अब, मैं हैंडलर को सभी पैरामीटर (यूआरएल कंपोनेंट्स और हेडर) पास करने में सक्षम हूं। –

+0

बाइंडिंग को संभालने के तरीके के लिए https://github.com/weavejester/compojure/blob/master/src/compojure/core.clj#L66 देखें – Ankur

+0

धन्यवाद अंकुर। 'वेक्टर-बाइंडिंग' के कार्यान्वयन को देखते हुए, चीजें अब मुझे स्पष्ट करती हैं कि यह सब कैसे काम करता है। –

संबंधित मुद्दे