使用 Webrick 在同一端口上提供文件和处理请求

Serving files & handling requests with Webrick on same port

您好,我需要能够接收来自 GitLab 的请求(body => JSON)以及在同一端口上提供文件。为此,我正在尝试使用 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 做到这一点?

是的,这对于 Webrick 或任何 HTTP 服务器来说当然是可能的。根据用户想要执行的操作,将有两种不同的 HTTP 操作,1.) GET 请求提供文件或 2.) POST 请求处理一些 JSON.

下面是一个简单的示例,向您展示如何执行这两项操作:

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

一旦 运行 您可以通过在单独的终端中执行以下操作来测试它 window:

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
- -> /

既然你提到了目的是一个轻型代码库,这里有一个轻型、快速的脚本,使用 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 - 这将激活网络服务器)