使用 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
- 这将激活网络服务器)
您好,我需要能够接收来自 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
- 这将激活网络服务器)