2015-04-23 42 views
0

嗨我需要能够接收来自GitLab(body => JSON)的请求以及在同一端口上提供文件。我正在尝试使用Webrick来达到这个目的。我可以分开做这些。在同一端口上使用Webrick服务文件和处理请求

文件服务解决方案我做的:

server = WEBrick::HTTPServer.new(:Port => 3030, :DocumentRoot => '/') 
server.start 

接收和处理JSON我做的:

server = WEBrick::HTTPServer.new(:Port => 3030, :DocumentRoot => '/') 
server.mount_proc '/' do | req, res | 
    Queue.new(req.body) 
end 

但我需要这个功能结合起来,是有办法与使用WEBrick做到这一点?

+0

我爱@Anthony给了答案,但我不知道 - 为什么不使用框架呢? Rails,Sinatra和[Plezi](https://github.com/boazsegev/plezi)应该在Webrick用于并发环境(比如生产环境)时工作得更快 - 并且Sinatra和Plezi都应该如此简单(如果不是那么容易)实施... – Myst

+0

这是针对大数据流水线测试的内部CI实现,而不是面向客户,我们希望它尽可能轻。 –

回答

2

是的,Webrick或任何HTTP服务器都可以。根据用户想要执行的操作,将会有两种不同的HTTP操作:1.)提供文件的GET请求或2.)处理某些JSON的POST请求。

这里有一个简单的例子来告诉你如何做到既:

class Server < WEBrick::HTTPServlet::AbstractServlet 
    def do_GET (request, response) 
     puts "this is a get request" 
    end 

    def do_POST (request, response) 
     puts "this is a post request who received #{request.body}" 
    end 
end 

server = WEBrick::HTTPServer.new(:Port => 3030) 

server.mount "/", Server 

trap("INT") { 
    server.shutdown 
} 

server.start 

一旦运行,你可以通过执行以下操作在一个单独的终端窗口测试:

curl localhost:3030 

输出:

this is a get request 
localhost - - [23/Apr/2015:06:39:20 EDT] "GET/HTTP/1.1" 200 0 
- ->/

要测试POST请求:

curl -d "{\"json\":\"payload\"}" localhost:3030 

输出:

this is a post request who received {"json":"payload"} 
localhost - - [23/Apr/2015:06:40:07 EDT] "POST/HTTP/1.1" 200 0 
- ->/
+0

谢谢你,我在你的回答实际出现之前自己解决了这个问题,但我发现你的回答更加优雅。再次感谢你。 –

1

既然你提到的目的,是光的代码库,这里是一盏灯,使用快速脚本Plezi framework ...

这将允许更容易的测试,我认为(但我有偏见)。另外,Plezi在我的机器上比Webrick快(尽管它是一个纯粹的ruby框架,不涉及机架或'c'扩展)。

require 'plezi' 

class MyController 
    def index 
     # parsed JSON is acceible via the params Hash i.e. params[:foo] 
     # raw JSON request is acceible via request[:body] 
     # returned response can be set by returning a string... 
     "The request's params (parsed):\n#{params}\n\nThe raw body:\n#{request[:body]}" 
    end 
end 

# start to listen and set the root path for serving files. 
listen root: './' 

# set a catch-all route so that MyController#index is always called. 
route '*', MyController 

(如果你正在运行从终端脚本,记得使用exit命令退出irb - 这将激活Web服务器)

相关问题