当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Ruby CGI类用法及代码示例


本文简要介绍ruby语言中 CGI类 的用法。

概述

通用网关接口 ( CGI ) 是一个简单的协议,用于将 HTTP 请求从 Web 服务器传递到独立程序,并将输出返回到 Web 浏览器。本质上, CGI 程序使用在环境 (GET) 或通过 $stdin (POST) 中传递的请求参数调用,并且它打印到 $stdout 的所有内容都返回给客户端。

该文件包含 CGI 类。此类提供检索 HTTP 请求参数、管理 cookie 和生成 HTML 输出的函数。

文件 CGI::Session 提供会话管理函数;有关更多详细信息,请参见该课程。

有关 CGI 协议的更多信息,请参阅www.w3.org/CGI /。

介绍

CGI 是一个大类,提供了几类方法,其中很多是从其他模块混入的。一些文档在这个类中,一些在模块 CGI::QueryExtension CGI::HtmlExtension 中。有关处理 cookie 的具体信息,请参见 CGI::Cookie ,有关会话的信息,请参见 cgi/session.rb ( CGI::Session )。

对于查询, CGI 提供了获取环境变量、参数、cookie 和多部分请求数据的方法。对于响应, CGI 提供了编写输出和生成 HTML 的方法。

请阅读以获得更多详情。底部提供了示例。

查询

CGI 类动态混合了参数和cookie-parsing 函数、环境变量访问,并支持解析来自 CGI::QueryExtension 模块的多部分请求(包括上传的文件)。

环境变量

标准 CGI 环境变量可用作 CGI 对象的只读属性。以下是这些变量的列表:

AUTH_TYPE               HTTP_HOST          REMOTE_IDENT
CONTENT_LENGTH          HTTP_NEGOTIATE     REMOTE_USER
CONTENT_TYPE            HTTP_PRAGMA        REQUEST_METHOD
GATEWAY_INTERFACE       HTTP_REFERER       SCRIPT_NAME
HTTP_ACCEPT             HTTP_USER_AGENT    SERVER_NAME
HTTP_ACCEPT_CHARSET     PATH_INFO          SERVER_PORT
HTTP_ACCEPT_ENCODING    PATH_TRANSLATED    SERVER_PROTOCOL
HTTP_ACCEPT_LANGUAGE    QUERY_STRING       SERVER_SOFTWARE
HTTP_CACHE_CONTROL      REMOTE_ADDR
HTTP_FROM               REMOTE_HOST

对于这些变量中的每一个,都有一个具有相同名称的对应属性,除了全部小写并且没有前面的 HTTP_。 content_lengthserver_port是整数;其余的是字符串。

参数

params() 方法以名称/value-list 对的形式返回请求中所有参数的哈希,其中 value-list 是一个或多个值的 Array CGI 对象本身也表现为参数名称到值的散列,但只为每个参数名称返回一个值(作为 String )。

例如,假设请求包含具有多个值 “blue” 和 “green” 的参数 “favourite_colours”。会出现以下行为:

cgi.params["favourite_colours"]  # => ["blue", "green"]
cgi["favourite_colours"]         # => "blue"

如果参数不存在,前一种方法将返回一个空数组,后一种方法将返回一个空字符串。测试参数是否存在的最简单方法是使用has_key?方法。

Crackers

HTTP Cookies 会自动从请求中解析。它们可从 cookies() 访问器获得,该访问器将 cookie 名称的哈希返回到 CGI::Cookie 对象。

多部分请求

如果一个请求的方法是 POST 并且它的内容类型是 multipart/form-data,那么它可能包含上传的文件。这些由 QueryExtension 模块存储在请求的参数中。和往常一样,参数名称是文件输入字段的名称属性。但是,该值不是字符串,而是 IO 对象,对于小文件是 IOString,对于大文件是 Tempfile 。这个对象还有额外的单例方法:

local_path()

本地文件系统上上传文件的路径

original_filename()

客户端计算机上的文件名

content_type()

文件的内容类型

回应

CGI 类提供了将标头和内容输出发送到 HTTP 客户端的方法,并混合了从 CGI::HtmlExtension 和 CGI::TagMaker 模块生成程序化 HTML 的方法。用于生成 HTML 的准确 HTML 版本在对象创建时指定。

写入输出

将输出发送到 HTTP 客户端的最简单方法是使用 out() 方法。这将 HTTP 标头作为散列参数,并通过块获取正文内容。可以使用 http_header() 方法将标头生成为字符串。可以使用 print() 方法直接写入输出流。

生成 HTML

每个 HTML 元素都有一个相应的方法来将该元素生成为 String 。这个方法的名字和元素的名字一样,都是小写的。元素的属性作为散列传入,主体作为无参数块传入,计算结果为 String 。 HTML 生成模块知道哪些元素始终为空,并默默地删除任何 passed-in 正文。它还知道哪些元素需要匹配结束标签,哪些不需要。但是,它不知道哪些属性对哪些元素是合法的。

CGI::HtmlExtension 模块中还混入了一些额外的 HTML 生成方法。这些包括用于不同类型表单输入的单独方法,以及用于通常采用特定属性的元素的方法,其中属性可以直接指定为参数,而不是通过哈希。

实用 HTML 转义和其他方法,如函数。

在 cgi/util.rb 中定义了一些实用工具。并且当包含时,您可以使用实用程序方法,如函数。

使用示例

获取表单值

require "cgi"
cgi = CGI.new
value = cgi['field_name']   # <== value string for 'field_name'
  # if not 'field_name' included, then return "".
fields = cgi.keys            # <== array of field names

# returns true if form has 'field_name'
cgi.has_key?('field_name')
cgi.has_key?('field_name')
cgi.include?('field_name')

警告! cgi 返回一个带有旧 cgi.rb 的 Array (包含在 Ruby 1.6 中)

获取表单值作为哈希

require "cgi"
cgi = CGI.new
params = cgi.params

cgi.params 是一个哈希。

cgi.params['new_field_name'] = ["value"]  # add new param
cgi.params['field_name'] = ["new_value"]  # change value
cgi.params.delete('field_name')           # delete param
cgi.params.clear                          # delete all params

将表单值保存到文件

require "pstore"
db = PStore.new("query.db")
db.transaction do
  db["params"] = cgi.params
end

从文件中恢复表单值

require "pstore"
db = PStore.new("query.db")
db.transaction do
  cgi.params = db["params"]
end

获取多部分表单值

require "cgi"
cgi = CGI.new
value = cgi['field_name']   # <== value string for 'field_name'
value.read                  # <== body of value
value.local_path            # <== path to local file of value
value.original_filename     # <== original filename of value
value.content_type          # <== content_type of value

并且 value 具有 StringIO Tempfile 类方法。

获取 cookie 值

require "cgi"
cgi = CGI.new
values = cgi.cookies['name']  # <== array of 'name'
  # if not 'name' included, then return [].
names = cgi.cookies.keys      # <== array of cookie names

和cgi.cookies 是一个哈希。

获取 cookie 对象

require "cgi"
cgi = CGI.new
for name, cookie in cgi.cookies
  cookie.expires = Time.now + 30
end
cgi.out("cookie" => cgi.cookies) {"string"}

cgi.cookies # { "name1" => cookie1, "name2" => cookie2, ... }

require "cgi"
cgi = CGI.new
cgi.cookies['name'].expires = Time.now + 30
cgi.out("cookie" => cgi.cookies['name']) {"string"}

将 http 标头和 html 字符串打印到 $DEFAULT_OUTPUT ($>)

require "cgi"
cgi = CGI.new("html4")  # add HTML generation methods
cgi.out do
  cgi.html do
    cgi.head do
      cgi.title { "TITLE" }
    end +
    cgi.body do
      cgi.form("ACTION" => "uri") do
        cgi.p do
          cgi.textarea("get_text") +
          cgi.br +
          cgi.submit
        end
      end +
      cgi.pre do
        CGI.escapeHTML(
          "params: #{cgi.params.inspect}\n" +
          "cookies: #{cgi.cookies.inspect}\n" +
          ENV.collect do |key, value|
            "#{key} --> #{value}\n"
          end.join("")
        )
      end
    end
  end
end

# add HTML generation methods
CGI.new("html3")    # html3.2
CGI.new("html4")    # html4.01 (Strict)
CGI.new("html4Tr")  # html4.01 Transitional
CGI.new("html4Fr")  # html4.01 Frameset
CGI.new("html5")    # html5

一些实用方法

require 'cgi/util'
CGI.escapeHTML('Usage: foo "bar" <baz>')

一些实用方法,如函数

require 'cgi/util'
include CGI::Util
escapeHTML('Usage: foo "bar" <baz>')
h('Usage: foo "bar" <baz>') # alias

相关用法


注:本文由纯净天空筛选整理自ruby-lang.org大神的英文原创作品 CGI类。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。