【问题标题】:Router file in Ruby webserverRuby 网络服务器中的路由器文件
【发布时间】:2016-05-07 21:08:04
【问题描述】:

PHP 有一个内置的webserver(示例#3),您可以在其中将路由器文件作为参数传递。每个请求都将通过该路由器文件,您可以在其中对请求执行各种操作。

php -S localhost:8000 router.php

路由器文件可能如下所示:

<?php
// router.php
if (preg_match('/\.(?:png|jpg|jpeg|gif)$/', $_SERVER["REQUEST_URI"])) {
   return false;    // serve the requested resource as-is.
} else { 
   echo "<p>Welcome to PHP</p>";
}
?>

对于像 Thin 这样的 Ruby 网络服务器也可以做到这一点吗?

谢谢!

【问题讨论】:

    标签: ruby webserver rack thin


    【解决方案1】:

    这听起来很像sinatra,这是一个非常轻量级的 ruby​​ Web 框架。

    例如,在一个 ruby​​ 文件中(比如说它叫做server.rb):

    require 'sinatra'
    get "/" do
      "hello world"
    end
    get "/:foo" do
      "you typed #{params[:foo]}"
    end
    

    在终端中:

    ruby server.rb
    # => listening on port 4567
    

    您可以在浏览器中转到localhost:4567 进行测试。

    【讨论】:

    • 是的,我知道 Sinatra。但是,我想要实现的是捕获所有这些请求并基于我想要动态运行 Rack 应用程序的 URI。 Sinatra 非常适合网络,但我认为将它用于此特定任务并不明智。
    • @FrankLevering 我不确定“动态”运行 Rack 应用程序,除了发出 shell 命令。你看过rack docs。不是想学究气,只是说我想的想法。我想知道您是否可以使用“直接处理应用程序”示例并在该文件中添加一些 sinatra 路由?
    • @FrankLevering 您还可以在特定端点“挂载”机架应用程序。见multiple-sinatra-apps-using-rack-mount
    • 感谢您为我指明正确的方向。我有点想办法做到这一点。我创建了一个运行应用程序的 config.ru。在该应用程序中,我可以基于例如 URI 运行其他 Rack 应用程序。
    • @FrankLevering 很高兴听到这个消息。如果可以的话,我很想看看你的代码要点
    【解决方案2】:

    在你的情况下,我将使用 rack,这是一个 ruby​​:

    1. Rack 包括将 Rack 连接到所有这些 Web 应用程序服务器(WEBrick、Mongrel 等)的处理程序。
    2. Rack 包括将 Rack 连接到各种 Web 框架(Sinatra、Rails 等)的适配器。
    3. 在服务器和框架之间,可以使用中间件根据您的应用程序需求定制 Rack。

    要使用 rack,您必须创建 rack 应用程序:

    1. 必须接电话方式。
    2. 调用方法由服务器调用,并且必须接收带有 CGI 信息的环境变量。
    3. 必须返回一个包含 3 个元素的数组: a) 状态:整数 b)标题:哈希 c) body:响应每个调用的对象,每个调用都返回一个字符串。

    Rack 中间件背后的基本思想是——位于调用客户端和服务器之间,在将 HTTP 请求发送到服务器之前处理它,在将 HTTP 响应返回给客户端之前处理它。

    这是您问题的基本答案:

    test_rack.rb
    
    class MyApp
      def call env
            [200, {"Content-Type" => "text/html"}, ["Hello Rack Participants"]]
      end
    end
    
    config.ru
    
    require './test_rack.rb'
    run MyApp.new
    

    然后启动应用程序,并调用 localhost:9292/anything

    ╭─toni@Antonios-MBP  ~/learn/ruby/stackoverflow/scripting ‹ruby-2.2.3@stackoverflow› ‹1.7› ‹SBCL 1.3.5›
    ╰─$ rackup config.ru
    [2016-05-08 11:17:41] INFO  WEBrick 1.3.1
    [2016-05-08 11:17:41] INFO  ruby 2.2.3 (2015-08-18) [x86_64-darwin15]
    [2016-05-08 11:17:41] INFO  WEBrick::HTTPServer#start: pid=2610 port=9292
    ::1 - - [08/May/2016:11:18:04 +0200] "GET /patata HTTP/1.1" 200 - 0.0010
    ::1 - - [08/May/2016:11:18:04 +0200] "GET /favicon.ico HTTP/1.1" 200 - 0.0005
    ::1 - - [08/May/2016:11:18:09 +0200] "GET /patata/calimero HTTP/1.1" 200 - 0.0003
    

    让我们看看 rack 在控制台中的工作,查看多个网络服务器并传递 lambda 以创建调用函数

    require 'rack'
    => true
    irb(main):010:0> Rack::Handler::constants
    => [:CGI, :FastCGI, :Mongrel, :EventedMongrel, :SwiftipliedMongrel, :WEBrick, :LSWS, :SCGI, :Thin]
    irb(main):026:0> Rack::Handler::WEBrick.run lambda { |env| [200,{"Content-Type" => "text/plain"}, ["Hello. The time is #{Time.now}"]] }
    [2016-05-08 11:22:39] INFO  WEBrick 1.3.1
    [2016-05-08 11:22:39] INFO  ruby 2.2.3 (2015-08-18) [x86_64-darwin15]
    [2016-05-08 11:22:39] INFO  WEBrick::HTTPServer#start: pid=1798 port=8080
    

    走得更远:

    https://blog.engineyard.com/2015/understanding-rack-apps-and-middleware

    https://github.com/rack/rack

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-08
      • 1970-01-01
      • 1970-01-01
      • 2015-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多