本文簡要介紹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_length
和server_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 CGI.new用法及代碼示例
- Ruby CGI.print用法及代碼示例
- Ruby CGI.http_header用法及代碼示例
- Ruby CGI.parse用法及代碼示例
- Ruby CGI.out用法及代碼示例
- Ruby CStructEntity.[]=用法及代碼示例
- Ruby Context.save_history=用法及代碼示例
- Ruby CSV.header_convert用法及代碼示例
- Ruby Constants模塊用法及代碼示例
- Ruby CMath tanh()用法及代碼示例
- Ruby CSV.skip_lines用法及代碼示例
- Ruby Comparable.between?用法及代碼示例
- Ruby Class類用法及代碼示例
- Ruby CMath cos()用法及代碼示例
- Ruby Complex.arg用法及代碼示例
- Ruby CSV.table用法及代碼示例
- Ruby CSV.force_quotes?用法及代碼示例
- Ruby CParser模塊用法及代碼示例
- Ruby CSV.unconverted_fields?用法及代碼示例
- Ruby ComposedSet類用法及代碼示例
- Ruby C.handle_constants用法及代碼示例
- Ruby Continuation類用法及代碼示例
- Ruby Closure類用法及代碼示例
- Ruby CStructEntity.[]用法及代碼示例
- Ruby Complex.abs2用法及代碼示例
注:本文由純淨天空篩選整理自ruby-lang.org大神的英文原創作品 CGI類。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。