如何访问 webrick 提供的 .rhtml 页面的 html 请求参数?

问题描述 投票:0回答:4

我正在使用 webrick(内置 ruby 网络服务器)来提供 .rhtml 文件(嵌入 ruby 代码的 html——如 jsp)。

它工作正常,但我不知道如何从 .rhtml 文件中的 ruby 代码中访问参数(例如 http://localhost/mypage.rhtml?foo=bar)。
(请注意,我没有使用rails框架,仅使用webrick + .rhtml文件)

ruby webrick rhtml
4个回答
3
投票

根据erbhandler的源代码,它以这种方式运行rhtml文件:

    Module.new.module_eval{
      meta_vars = servlet_request.meta_vars
      query = servlet_request.query
      erb.result(binding)
    }

因此,绑定应该包含一个

query
(其中包含查询字符串的哈希值)和一个
meta_vars
变量(其中包含环境的哈希值,如
SERVER_NAME
),您可以在 rhtml 文件中访问它们(以及
servlet_request
servlet_response
也可能可用,但我不确定)。

如果不是这种情况,您也可以尝试查询 CGI 参数

ENV["QUERY_STRING"]
并解析它,但这只能作为最后的手段(并且它可能只适用于 CGI 文件)。


3
投票

这就是解决方案:

(假设请求是 http://your.server.com/mypage.rhtml?foo=bar

 <html>

    <body>

    This is my page (mypage.rhtml, served by webrick)

    <%
    # embedded ruby code

    servlet_request.query ["foo"] # this simply prints bar on console

    %>

    </body>

</html>

2
投票

您没有提供太多细节,但我想您有一个 servlet 来提供您将使用 erb 处理的文件,并且默认情况下 Web 服务器提供公共目录中的任何静态文件。

require 'webrick'
include WEBrick
require 'erb'

s = HTTPServer.new( :Port => 8080,:DocumentRoot    => Dir::pwd + "/public" )

class MyServlet < HTTPServlet::AbstractServlet
  def do_GET(req, response)
    File.open('public/my.rhtml','r') do |f|
     @template = ERB.new(f.read)
    end
    response.body = @template.result(binding)
    response['Content-Type'] = "text/html"
   end
end

s.mount("/my", MyServlet)

trap("INT"){
  s.shutdown
}
s.start

这个例子是有限的,当你去 /my 时总是处理相同的文件。这里你应该根据请求路径构建文件路径。这里我说了一个重要的词:“请求”,你需要的一切都有。

要获取 HTTP 标头参数,请使用 req[header_name]。要获取查询字符串中的参数,请使用 req.query[param_name]。 req 是传递给 servlet 的 HTTPRequest 对象。

一旦获得了所需的参数,就必须将其绑定到模板。在示例中,我们从 self 传递绑定对象(绑定在内核中定义,它代表代码执行的上下文),因此 do_GET 方法中定义的每个局部变量都可以在模板中使用。但是,您可以创建自己的绑定,例如传递 Proc 对象并在调用“结果”时将其传递给 ERB 处理器。

将所有内容放在一起,您的解决方案将如下所示:

  def do_GET(req, response)
    File.open('public/my.rhtml','r') do |f|
     @template = ERB.new(f.read)
    end

    foo = req.query["foo"]
    response.body = @template.result(binding)
    response['Content-Type'] = "text/html"
   end

1
投票

浏览文档,看起来您应该有一个

HTTPRequest
,您可以从中获取查询字符串。然后,您可以使用
parse_query
获取名称/值哈希。

或者,只需调用

query()
就可以直接给你哈希值...我的 Ruby-fu 不太适合它,但你可能至少想尝试一下。

© www.soinside.com 2019 - 2024. All rights reserved.