Обслуживание файлов и обработка запросов с помощью 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 команда - это активирует веб-сервер)

Другие вопросы по тегам