2012-01-22 19 views
9

मैं यूआरएल क्वेरी स्ट्रिंग से एक मूल्य खींचने की कोशिश कर रहा हूं, हालांकि मैं जो भी मानता हूं वह वापस कर सकता हूं, हालांकि जब मैं नीचे कोड का उपयोग करता हूं, तो यह अपेक्षा के अनुसार संसाधित नहीं करता है। क्या कोई सलाह दे सकता है कि मैं लौटाए गए क्वेरीस्ट्रिंग डेटास्ट्रक्चर में विशिष्ट मानों का उपयोग कैसे करूं?कंपोज़र क्वेरी स्ट्रिंग एक्सेसिंग

http://localhost:8080/remservice?foo=bar

(defroutes my-routes 
    (GET "/" [] (layout (home-view))) 
    (GET "/remservice*" {params :query-params} (str (:parameter params)))) 
+0

यहां दो प्रश्न हैं। क्या यह फ़ंक्शन पैरामीटर लेता है? क्या मिलता है? यही कारण है कि मैं पूछ रहा हूँ। आपको पैराम्स से जो चाहिए उसे निकालने में सक्षम होना चाहिए, लेकिन परम कहां है? – octopusgrabbus

उत्तर

17

आप compojure.handler/api या compojure.handler/site में अपने हैंडलर रैप करने के लिए उचित मिडलवेयर :query-params तक पहुँचने में जोड़ने की आवश्यकता होगी। यह defroutes में स्वचालित रूप से होता था, लेकिन अब नहीं करता है। एक बार ऐसा करने के बाद, {params :query-params} विनाशकारी फॉर्म params{"foo" "bar"} तक बाध्य होने के कारण /remservicefoo=bar क्वेरी स्ट्रिंग के रूप में दबाएगा।

(या आप wrap-params आदि में जोड़ सकता है हाथ से - इन विभिन्न ring.middleware.* नामस्थान में रहते हैं;। देख the code of compojure.handler (उनके नाम के लिए Compojure 1.0.1 में प्रासंगिक फ़ाइल के लिए लिंक))

जैसे आपकी क्वेरी स्ट्रिंग के शाब्दिक प्रतिनिधित्व एक Clojure नक्शे में पार्स -

(defroutes my-routes 
    (GET "/remservice*" {params :query-params} 
     (str params))) 

(def handler (-> my-routes compojure.handler/api)) 

; now pass #'handler to run-jetty (if that's what you're using) 

तुम अब हिट http://localhost:8080/remservice?foo=bar, आप {"foo" "bar"} देखना चाहिए।

+0

ठीक है, मुझे यह एक नक्शा लौटा रहा है, हालांकि मैं व्यक्तिगत प्रविष्टियों में उपयोग नहीं कर सकता, उदाहरण के लिए (: foo params) या (पैराम foo प्राप्त करें) या (मानचित्र: foo params) कुछ भी वापस नहीं करता है। मुझे लगता है कि इस मानचित्र संरचना के आसपास मेरा मुख्य भ्रम वापस आ गया है। – Dale

+1

ऐसा इसलिए है क्योंकि चाबियाँ स्ट्रिंग फॉर्म में रखी जाती हैं - आपको '(पैराम "प्राप्त करें") का उपयोग करने की आवश्यकता होगी।वैकल्पिक रूप से, आप ': क्वेरी-पैराम्स 'के बजाय' पैराम 'का उपयोग कर सकते हैं - कंपोज़र की' एपीआई '' रैप-कीवर्ड-पैरा 'मिडलवेयर में जोड़ता है, इसलिए' पैराम्स 'मानचित्र" keyified "है - लेकिन नोट कि 'पैराम्स' में दोनों प्रकार के पैरामीटर शामिल हैं (दूसरा फॉर्म पैरामीटर है; क्वेरी पैरामीटर 'पैराम्स' मानचित्र में फॉर्म पैरामीटर ओवरराइड करते हैं)। –

+0

आप इस तरह कुछ कैसे करते हैं:/users/123? Sort = desc मेरे पास वेक्टर में पारित पैराम हैं। –

-1

मैं 1.1.5 एक आवरण की जरूरत नहीं और compojure 1.2.0 के लिए डिफ़ॉल्ट ऐप्लिकेशन में :as निर्देश

(GET "/tweet/:folder/:detail" [folder detail :as req] 
    (twitter-controller/tweet folder detail (-> req :params :oauth_verifier)) 
0

उपयोग करने में सक्षम होने के नाते, क्वेरी स्ट्रिंग मिडलवेयर डिफ़ॉल्ट रूप से शामिल लगता compojure में भाग्य था। आप इस तरह के अनुरोध का निरीक्षण कर सकते हैं।

(GET "/" request (str request)) 

यह params कुंजी सहित, सामान का एक बहुत होना चाहिए।

{ . . . :params {:key1 "value1" :key2 "value2} . . . } 

इस प्रकार, आप अपनी प्रतिक्रिया में क्वेरी पैरामीटर तक पहुंचने के लिए एक मानक क्लोजर विनाशकारी फॉर्म शामिल कर सकते हैं।

(GET "/" {params :params} (str params)) 

आपका पृष्ठ तब निम्न जैसा दिखना चाहिए।

{"key1" "value1", "key2" "value2"} 

ऊपर मीकल से टिप्पणी में बताया गया है, हालांकि, कुंजी तार में बदल दिए जाते हैं और आप उन्हें उपयोग करने के लिए चाहते हैं, तो आप और अधिक सुविधाजनक प्रतीक लुकअप बजाय प्राप्त फ़ंक्शन का उपयोग करना।

(GET "/" {params :params} (get params "key1")) 

;;the response body should be "value1" 
संबंधित मुद्दे