2012-03-14 15 views
5

साथ एक JSON ऑब्जेक्ट प्राप्त करने के लिए मैं की तरह, एक बहुत ही सरल रूबी रैक सर्वर है:कैसे रैक

app = Proc.new do |env| 
    req = Rack::Request.new(env).params 
    p req.inspect 
    [200, { 'Content-Type' => 'text/plain' }, ['Some body']] 
end 

Rack::Handler::Thin.run(app, :Port => 4001, :threaded => true) 

जब भी मैं एक JSON ऑब्जेक्ट के साथ सर्वर के लिए एक पोस्ट HTTP अनुरोध भेजें:

{ "session": { 
"accountId": String, 
"callId": String, 
"from": Object, 
"headers": Object, 
"id": String, 
"initialText": String, 
"parameters": Object, 
"timestamp": String, 
"to": Object, 
"userType": String } } 

मुझे कुछ भी नहीं मिला है। मैं प्राप्त अनुरोध का पता लगा सकता हूं लेकिन डेटा नहीं प्राप्त कर सकता।

"{}" 

मैं कैसे डेटा प्राप्त करना चाहिए: puts req.inspect के लिए मेरे कंसोल पर परिणाम कुछ की तरह है?

मुझे लगता है कि बदलने के लिए की तरह कुछ के साथ करने की कोशिश की:

request = Rack::Request.new env 
object = JSON.parse request.body 
puts JSON.pretty_generate(object) 

लेकिन मैं निम्न चेतावनी हो रही है:

!! Unexpected error while processing request: can't convert StringIO into String 
+0

क्या JSON का एक उदाहरण भेजा जा रहा है:

# ... request = Rack::Request.new env object = JSON.parse request.body.gets # ... 

दस्तावेज़ देखें? । संदेश = JSON.parse env [ 'rack.input'] बस का उपयोग पढ़ा तब: – tadman

+0

कुछ भी नहीं भेजा, JSON कुछ की तरह उपरोक्त उदाहरण सत्र जड़ के साथ – Eqbal

+0

ठीक है ऐसा लगता है कि मैं की तरह कुछ का उपयोग करने वाला हूँ प्राप्त की जा रही संदेश हैश में पैराम, कम से कम यह मुझे इस तरह से काम करता है – Eqbal

उत्तर

5
env['rack.input'].gets 

यह मेरे लिए काम करता है। मैंने पाया कि रैक (v1.4.1) सर्वर के खिलाफ POST अनुरोधों का परीक्षण करने के लिए कर्ल या wget का उपयोग करके अनुरोध कोड प्राप्त करने के लिए इस कोड का उपयोग करने के लिए आवश्यक है। जंगली में POST अनुरोध (उदा। गिटहब वेबहुक) में भी यही समस्या नहीं थी। ऐसा करने के लिए

+1

fyi के बाद कॉल करने की आवश्यकता हो सकती है, 'get' केवल पहली पंक्ति पढ़ेगी –

4

ऐसा लगता है कि मैं की तरह कुछ का उपयोग करने वाला हूँ:

msg = JSON.parse env['rack.input'].read 

फिर msg हैश में params का उपयोग करें।

कम से कम यह मेरे लिए इस तरह से काम करता है।

+0

यदि आप env को देखते हैं, तो आपको इस तरह की एक जोड़ी मिल जाएगी: '" rack.input "=> # <रैक :: लिंट :: इनपुटवापर: 0x007fd293a085d0 @ इनपुट = # <स्ट्रिंगियो: 0x007fd2939f1088 >>, इसका मतलब है कि आप इसे आईओ के रूप में कर सकते हैं, इसलिए उस पर 'read' विधि का उपयोग करें। – Juguang

+0

को '.read'' को पहले और/या '.read' –

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