4

我需要在 Ruby(不是 Rails 或任何其他框架)中轻松获取像 GET 这样的请求数据的最低要求是多少?

我想避免必须使用 ruby​​ on rails 或任何其他框架来获取这些数据,所以理想的答案不会有框架依赖。

我当前的设置在 apache ( )上有一个 ruby​​ 文件 ( script)cgi-binsite.com/script

#!/usr/bin/env ruby

# bare minimum to output content
puts "Content-type: text/html"
puts

puts "it works!" #works fine.

# how would I obtain request data like GET parameters here
# for a url like site.com/script?hi=there
# in PHP, I would $_GET['hi']
4

3 回答 3

5

啊,使用 CGI 类解决了我的问题。

http://www.ruby-doc.org/stdlib-1.9.3/libdoc/cgi/rdoc/CGI.html

require 'cgi'

cgi = CGI.new

cgi.params.each do |key, val|
   puts key
   puts val
end

所以site.com/script?hi=there会输出hi\nthere

于 2012-10-15T21:39:14.657 回答
5

请不要在没有框架的情况下这样做。有一些像Sinatra这样的超轻量级的,它们尽可能少地确保您获得正确执行此操作所需的支持。CGI 在 1990 年代死去,现在不需要回来了。

要编写 Sinatra 应用程序,您基本上定义一个方法,然后将其部署到您的服务器。当然,您可能会抱怨工作量很大,但如果您没有适当的部署程序,您甚至在开始之前就遇到了麻烦。

Ruby 围绕诸如 Rack 之类的东西构建了许多基础设施,这些基础设施通过诸如Passenger之类的模块连接到 Apache,这些模块比以往任何时候都做得更多,cgi-bin而且没有与之相关的所有风险。

一个典型的 Sinatra 应用程序如下所示:

get '/example/:id' do
  "Example #{params[:id]}!"
end

它真的没什么,它最终比旧的 CGI 方式少了很多工作。

于 2012-10-15T21:40:02.237 回答
2

如果您的 Web 服务器将脚本作为CGI程序调用,则内容将位于QUERY_STRING环境变量中,可通过ENV对象访问。如果没有框架,您将不得不将其解析为单独的名称-值对以获得类似 PHP 的$_GET.

因为 Ruby 是一种通用编程语言,它没有处理 HTTP 请求或 CGI 环境的核心类和方法。这就是为什么建议使用框架(例如 Ruby on Rails)来处理协议级别的解析和设置的原因。犯错的地方太多了,不值得重新发明轮子。

于 2012-10-15T21:39:26.643 回答