Обслуживание файлов и обработка запросов с помощью Webrick на одном и том же порту
Привет мне нужно иметь возможность получать запросы от 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?
2 ответа
Да, это возможно с 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
После этого вы можете проверить это, выполнив следующие действия в отдельном окне терминала:
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...
Я думаю, это облегчит тестирование (но я предвзятый). Кроме того, 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
(если вы запускаете скрипт из терминала, не забудьте выйти irb
с использованием exit
команда - это активирует веб-сервер)