2013-07-11 63 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 - 你如何发送请求? –