2012-10-31 26 views
5

मैं वर्तमान में clojure में कुछ REST API का सामान कर रहा हूँ अप खिलवाड़, और मैं compojure साथ ring.middleware.format पुस्तकालय का उपयोग कर रहा है और clojure डेटा संरचनाओं से JSON को बदलने के लिए।Clojure अंगूठी रैप-json-पैरामीटर JSON सरणियों

मैं, एक बहुत बड़ा मुद्दा हो रहा है कि में और JSON अंगूठी एप्लिकेशन पर पोस्ट किए गए सभी सरणियों पहले आइटम है कि सरणी में था के साथ प्रतिस्थापित करना होगा। अर्थात। यह इस

{ 
    "buyer": "Test Name", 
    "items": { 
     "qty": 1, 
     "size": "M", 
     "product": "Green T-Shirt" 
    }, 
    "address": "123 Fake St", 
    "shipping": "express" 
} 

यह सहित एक सरणी मूल तत्व है जब किसी भी सरणियों, के लिए यह करता है करने के लिए से

{ 
    "buyer":"Test Name", 
    "items":[ 
     {"qty":1,"size":"S","product":"Red T-Shirt"}, 
     {"qty":1,"size":"M","product":"Green T-Shirt"} 
    ], 
    "address":"123 Fake St", 
    "shipping":"express" 
} 

इस JSON इसे करने के लिए तैनात हो जाएंगे।

मैं clojure में निम्नलिखित कोड का उपयोग कर रहा json वापस जाने के लिए:

(defroutes app-routes 
    (GET "/" 
     [] 
     {:body test-data}) 
    (POST "/" 
     {data :params} 
     {:body data})) 
     ;{:body (str "Printing " (count (data :jobs)) " jobs")})) 

(def app 
    (-> (handler/api app-routes) 
     (wrap-json-params) 
     (wrap-json-response))) 

प्राप्त मार्ग सरणियों और आउटपुट के साथ कोई मुद्दों पर ठीक है, इसलिए यह मैं डेटा हो रही है या किसी भी तरह से हो गया है wrap-restful-params मिडलवेयर।

कोई विचार?

उत्तर

3

मैं अंगूठी json-पैरामीटर के साथ इसी तरह की समस्या हो रहा है। तो मैं कच्चे अनुरोध निकाय का उपयोग कर समाप्त हुआ और JSON स्ट्रिंग को पार्स कर रहा हूं।

मैं folliwng कोड का इस्तेमाल किया:

(defroutes app-routes 
(POST "/" 
    {params :body} 
    (slurp params))) 

मैं JSON को पार्स करने CLJ-json.core पुस्तकालय का उपयोग करें।

उम्मीद है कि इससे मदद मिलती है। यदि आपने एक बेहतर तरीका निकाला है तो कृपया साझा करें। मैं एक क्लोजर/कंपोज़र नौसिखिया हूँ !!!

+0

धन्यवाद! यह बहुत अच्छा काम किया। यह एक आदर्श समाधान नहीं है, लेकिन यह काम करता है। –

+1

ग्रेट। मैं मानता हूं कि यह सबसे अच्छा समाधान नहीं है। मैंने रिंग-जेसन-पैराम्स रिपोजिटरी को फोर्क किया है और समस्या को हल करने और ठीक करने की कोशिश करेगा। –

+0

क्या आप कभी इस के नीचे पहुंच गए थे? मुझे रिंग-मिडलवेयर प्रारूप में एक समान समस्या मिली और एक मुद्दा खोला: https://github.com/ngrunwald/ring-middleware-format/issues/15 – noahlz

0

मैं जानता हूँ कि यह कुछ समय हो गया है, लेकिन मैं सिर्फ एक ही मुद्दा पर ठोकर था। एक ही रास्ता मैं यह काम करने के लिए मिल गयाcompojure.handler/api से पहले ring.middleware.format/wrap-restful-formatउपयोग करने के लिए किया गया था। मुझे यकीन है कि ऐसा क्यों है नहीं कर रहा हूँ लेकिन अगर मैं compujure.handler/api आवरण पहले डाल दिया, यह सरणी parameteres

0

मैं हाल ही में इस समस्या का सामना किया है और वास्तव में पता लगा कि समस्या क्या है को खराब करता है: यह आप wrap-nested-params मिडलवेयर हो रही है कि अपने wrap-json-params मिडलवेयर, जो JSON सरणियों में संग्रहित वस्तुओं का कारण बनता है के बाद का मूल्यांकन/Clojure वैक्टर के भीतर निहित पहला तत्व हथियाने से चपटा किया जाना है।

user=> bod-map 
{:address "100 Bush Street", :contacts [{:name "Dudely Mcdooderson", :title "engineer", :tax_id "555"}], :name "Dudely Inc.", :tax_id "5234234"} 
user=> (ring.middleware.nested-params/nested-params-request {:params bod-map}) 
{:params {"tax_id" "5234234", "name" "Dudely Inc.", "contacts" {:name "Dudely Mcdooderson", :title "engineer", :tax_id "555"}, "address" "100 Bush Street"}} 

आप इस के आसपास बस सुनिश्चित करें कि रैप-नेस्टेड-पैरामीटर अपने मिडलवेयर आदेश में पहली मूल्यांकन किया जाता है बनाने के द्वारा प्राप्त कर सकते हैं।