2012-03-14 20 views
5

Tôi có một máy chủ rack rất đơn giản Ruby, như:Làm thế nào để nhận được một đối tượng JSON với rack

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) 

Bất cứ khi nào tôi gửi một yêu cầu POST HTTP đến máy chủ với một đối tượng JSON:

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

Tôi không nhận được gì. Tôi có thể phát hiện yêu cầu nhận được nhưng không thể nhận dữ liệu. Các kết quả tại bàn điều khiển của tôi cho puts req.inspect là một cái gì đó như:

"{}" 

Làm cách nào để nhận dữ liệu?

Tôi cố gắng để thay đổi điều đó với một cái gì đó như:

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

Nhưng tôi nhận được cảnh báo sau đây:

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

gì một ví dụ về JSON được gửi đi? – tadman

+0

không có gì được gửi, JSON được nhận một cái gì đó giống như ví dụ trên với phiên gốc – Eqbal

+0

Ok có vẻ như tôi đang sử dụng một cái gì đó như: msg = JSON.parse env ['rack.input'] đọc Sau đó, chỉ cần sử dụng params trong msg băm, ít nhất nó làm việc với tôi theo cách này – Eqbal

Trả lời

5
env['rack.input'].gets 

Điều này phù hợp với tôi. Tôi thấy rằng sử dụng curl hoặc wget để kiểm tra các yêu cầu POST đối với máy chủ Rack (v1.4.1) bắt buộc sử dụng mã này làm dự phòng để có được phần thân yêu cầu. Yêu cầu POST trong tự nhiên (ví dụ: GitHub WebHooks) không có vấn đề tương tự.

+1

fyi, 'gets' sẽ chỉ đọc dòng đầu tiên –

4

Dường như tôi dự định sử dụng một cái gì đó như:

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

Sau đó, chỉ cần sử dụng params trong mã băm msg.

Ít nhất nó làm việc cho tôi theo cách này.

+0

Nếu bạn nhìn vào env, bạn sẽ tìm thấy một cặp như thế này: '" rack.input "=> # >, 'có nghĩa là bạn có thể là IO, vì vậy hãy sử dụng phương thức' read' trên đó. – Juguang

+0

Có thể cần phải gọi '.rewind' trước và/hoặc sau' .read' –

Các vấn đề liên quan