2013-07-11 133 views
3

我有一個使用eventmachine接收http請求的集成測試。這是我的事件機器處理程序:如何在Ruby中解析(未獲取)HTTP請求

class NotificationRecipient < EM::Connection 
    def receive_data(data) 
    EM.stop 
    end 
end 

我需要測試接收到的請求的各種屬性,例如,我想從我收到的HTTP POST請求字符串中提取json有效內容。有沒有一個很好的打包方式來做到這一點?

谷歌搜索發現很多方式來提出請求並解析響應,例如, rest-client會自動解析響應。但是,由於我收到了這個請求,而沒有這樣做,所以這些方法都不適合我。

+0

你如何接收請求? – toro2k

+2

此處需要更多信息。你如何接收POST? Rails的?西納特拉?其他?每個框架都有它自己的特性,我們需要更多的信息給你任何幫助。 – Eugene

+0

我正在使用eventmachine,並已更新問題以反映此問題。我很高興使用內置於eventmachine的功能。我曾假設會有一些通用的http gem,與發送和接收的具體框架無關。 – Stefan

回答

8

我會利用WEBrickWEBrick::HTTPRequest有一個可用的解析器,你需要做的就是將一個IO對象傳遞給parse方法,並且你有一個你可以操縱的對象。

本示例在字符串中聲明帶有JSON正文的POST請求,並使用StringIO將其作爲IO對象進行訪問。

require 'webrick' 
require 'stringio' 

Request = <<-HTTP 
POST /url/path HTTP/1.1 
Host: my.hostname.com 
Content-Type: application/json 
Content-Length: 62 

{ 
    "firstName": "John", 
    "lastName": "Smith", 
    "age": 25 
} 
HTTP 

req = WEBrick::HTTPRequest.new(WEBrick::Config::HTTP) 
req.parse(StringIO.new(Request)) 

puts req.path 
req.each { |head| puts "#{head}: #{req[head]}" } 
puts req.body 

輸出

/url/path 
host: my.hostname.com 
content-type: application/json 
content-length: 62 
{ 
    "firstName": "John", 
    "lastName": "Smith", 
    "age": 25 
} 
+0

完美!做了這項工作,並且獨立於Web框架。 – Stefan

+0

哇。太酷了...... –

+0

@Borodin - 你如何發送請求? –