2013-03-17 8 views
16

जब मैं कर्ल आदेशरैक अनुरोध में कैसे पढ़ने के लिए पोस्ट डेटा

curl -v -H "Content-type: application/json" -X POST -d '{"name":"abc", "id":"12", "subject":"my subject"}' http://localhost:9292 

चलाने डेटा के साथ एक पोस्ट अनुरोध, मेरे कोड प्रिंट बाहर {} मेरी रैक आवेदन करने के लिए भेजने के लिए। यह नीचे दिए गए कोड में puts req.POST() से आ रहा है।

यह पोस्ट डेटा के बजाय {} क्यों प्रिंट करता है? और मैं अपने रैक एप्लिकेशन में POST डेटा को सही तरीके से कैसे एक्सेस करूं?

require 'json' 

class Greeter 
    def call(env) 
    req = Rack::Request.new(env) 
    if req.post? 
     puts req.POST() 
    end 
    [200, {"Content-Type" => "application/json"}, [{x:"Hello World!"}.to_json]] 
    end 
end 

run Greeter.new 

उत्तर

17

पोस्ट के लिए दस्तावेज़ पढ़ने से, ऐसा लगता है कि यह आपको अन्य सामग्री प्रकारों के आधार पर पार्स किया गया डेटा दे रहा है। आप "application/json" कार्रवाई करने के लिए चाहते हैं, तो आप शायद

JSON.parse(req.body.read) 
बजाय

की जरूरत है। इस जांच करने के लिए,

puts req.body.read 

कोशिश जहां आप वर्तमान puts req.POST है।


req.body एक आई/ओ ऑब्जेक्ट है, स्ट्रिंग नहीं। body दस्तावेज़ीकरण देखें और स्रोत देखें। आप देख सकते हैं कि यह वास्तव में मुदासोवा के उत्तर जैसा ही है।

ध्यान दें कि रैक एप्लिकेशन में अन्य कोड उसी I/O को पढ़ने की उम्मीद कर सकते हैं, जैसे सिनात्रा या रेल में परम पार्सर्स। यह सुनिश्चित करने के लिए कि वे एक ही डेटा देखते हैं और कोई त्रुटि नहीं मिलती है, तो आप अपने कोड में अनुरोध निकाय को पढ़ने से पहले और बाद में संभवतः req.body.rewind पर कॉल करना चाह सकते हैं। हालांकि, यदि आप ऐसी परिस्थिति में हैं, तो आप इसके बजाय विचार कर सकते हैं कि आपके ढांचे में नियंत्रक पर कुछ विकल्प के माध्यम से सीधे JSON को संसाधित करने या सामग्री-प्रकार हैंडलर घोषणा आदि का अनुरोध करने के विकल्प हैं - संभवतः इस तरह के तरीके को संभालने का विकल्प होगा ढांचे के भीतर अनुरोध करें।

+1

एफवाईआई - मिडलवेयर से आई/ओ स्ट्रीम पढ़ना रेल ऐप तोड़ सकता है। जब आपको मूल्य मिल गया है, तो आपको स्ट्रीम को रीसेट करने के लिए 'req.env [' rack.input '] चलाने के लिए सुनिश्चित करना होगा। – lookitsatravis

+0

@lookitsatravis: धन्यवाद, मैंने इसके बारे में उत्तर में एक नोट जोड़ा है। ओपी रेल या अन्य ढांचे के बिना सीधे रैक का उपयोग कर रहा है, इसलिए यह उनके मामले में लागू नहीं होगा। यदि आप रेल का उपयोग कर रहे हैं, तो 'एप्लिकेशन/जेसन' अनुरोध पढ़ने के अन्य तरीके होंगे –

+0

@Niel: सहमत! मेरे विशेष उपयोग मामले में, मैं [रैक-हमला] (https://github.com/kickstarter/rack-attack) का उपयोग कर रहा हूं और मेरे लॉगिन थ्रॉटल चेक में से एक की आवश्यकता है कि रेलवे इसे पढ़ने से पहले मैं अनुरोध निकाय को पार्स कर दूं। एज केस, सुनिश्चित करने के लिए, लेकिन यह मुझे इस पोस्ट और मेरी टिप्पणी के लिए नेतृत्व किया। चीयर्स! – lookitsatravis

8

प्रयास करें:

env['rack.input'].read 

मैं, हालांकि यह अभी भी मुझे अजीब लगता है "How to receive a JSON object with Rack" में यह पाया जाता है और, यह संभावना है काम करता है।

+2

fyi, 'get' केवल पहली पंक्ति –

+4

पढ़ेगा न केवल यह केवल पहले लिन को पढ़ेगा, यह धारा में एक सेपरेटर (डिफ़ॉल्ट रूप से \ n') को जोड़ देगा। यह जेएसओएन पार्सिंग जैसी चीजों को तोड़ देगा और हस्ताक्षर करने का अनुरोध करेगा। 'Env [' 'rack.input'] करने के लिए बहुत बेहतर है। पढ़ें – ianks

3

आप कोशिश कर सकते हैं:

req.params 

आशा यह आप कर सकते हैं।

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