Ruby 的 CGI
库用于处理 Web 服务器的 CGI(Common Gateway Interface)请求,提供了丰富的方法来解析请求参数、生成 HTML、处理 Cookie、Session、文件上传等。
📌 目录
- 🔹 CGI 类简介
- 🔹 CGI 请求处理方法
- 🔹 生成 HTTP 头部
- 🔹 处理 HTML 响应
- 🔹 处理表单参数(GET/POST)
- 🔹 处理 Cookie
- 🔹 处理文件上传
- 🔹 处理 Session
- 🔹 CGI 调试与错误处理
- 🔹 参考资料
🔹 CGI 类简介
CGI(Common Gateway Interface)是 Web 服务器与后端程序(如 Ruby 脚本)通信的标准协议。Ruby 的 CGI
类封装了 Web 请求的处理,如 表单数据、Cookie、Session、文件上传,并支持 HTML 生成。
示例:简单 CGI 脚本
#!/usr/bin/env ruby
require 'cgi'
cgi = CGI.new
puts cgi.header
puts "<html><body><h1>Hello, Ruby CGI!</h1></body></html>"
🔹 CGI 请求处理方法
1. 获取 CGI 请求方法
cgi = CGI.new
puts "请求方法: #{cgi.request_method}"
GET
请求时:cgi.request_method == "GET"
POST
请求时:cgi.request_method == "POST"
2. 获取所有请求参数
cgi = CGI.new
params = cgi.params # 返回 Hash,key 为参数名,value 为数组
params.each do |key, value|
puts "#{key}: #{value.join(', ')}"
end
3. 获取单个参数
name = cgi['name'] # 获取单个参数
puts "Hello, #{name}!"
🔹 生成 HTTP 头部
CGI 脚本的响应必须包含 Content-Type 头部:
puts "Content-type: text/html\n\n"
或者使用 cgi.header
:
puts cgi.header("type" => "text/html")
常见的 Content-Type
类型 | 说明 |
---|---|
text/html | HTML 网页 |
text/plain | 纯文本 |
application/json | JSON 数据 |
application/xml | XML 数据 |
image/png | PNG 图片 |
🔹 处理 HTML 响应
1. 直接输出 HTML
puts "Content-type: text/html\n\n"
puts "<html><body><h1>欢迎使用 Ruby CGI</h1></body></html>"
2. 使用 cgi.html
方法生成 HTML
puts cgi.out do
cgi.html do
cgi.head { cgi.title { "CGI 页面" } } +
cgi.body do
cgi.h1 { "欢迎使用 Ruby CGI" } +
cgi.p { "当前时间:#{Time.now}" }
end
end
end
🔹 处理表单参数(GET/POST)
1. 处理 GET 参数
cgi = CGI.new
name = cgi['name']
puts "Hello, #{name}!"
访问:
http://localhost/cgi-bin/script.rb?name=Ruby
2. 处理 POST 参数
cgi = CGI.new
name = cgi.params['name'][0]
puts "Hello, #{name}!"
HTML 表单
<form action="/cgi-bin/post.rb" method="post">
<input type="text" name="name">
<input type="submit" value="提交">
</form>
🔹 处理 Cookie
1. 设置 Cookie
cookie = CGI::Cookie.new("name" => "user", "value" => "Ruby", "expires" => Time.now + 3600)
puts cgi.header("cookie" => cookie)
2. 读取 Cookie
cookies = cgi.cookies
user_cookie = cookies["user"]
puts "Cookie 值: #{user_cookie}"
3. 删除 Cookie
cookie = CGI::Cookie.new("name" => "user", "value" => "", "expires" => Time.at(0))
puts cgi.header("cookie" => cookie)
🔹 处理文件上传
1. 处理上传文件
cgi = CGI.new
file = cgi['file']
if file && file.respond_to?(:read)
File.open("/tmp/#{file.original_filename}", "wb") { |f| f.write(file.read) }
puts "上传成功: #{file.original_filename}"
end
2. HTML 上传表单
<form action="/cgi-bin/upload.rb" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="上传">
</form>
🔹 处理 Session
Ruby CGI 没有内置 Session 机制,可以使用 cgi.session
来模拟:
require 'cgi/session'
cgi = CGI.new
session = CGI::Session.new(cgi)
session['username'] = 'RubyUser'
puts "Content-type: text/html\n\n"
puts "<p>Session 变量: #{session['username']}</p>"
session.close
🔹 CGI 调试与错误处理
1. 输出 CGI 头部防止 500 错误
puts "Content-type: text/html\n\n"
2. 捕获异常
begin
cgi = CGI.new
puts "Content-type: text/html\n\n"
puts "<h1>#{cgi['name']}</h1>"
rescue => e
puts "<h1>错误: #{e.message}</h1>"
end
3. 查看 CGI 变量
ENV.each { |key, value| puts "#{key}: #{value}<br>" }
🔹 参考资料
总结
cgi['param']
获取 GET/POST 参数,可处理表单数据。cgi.header
生成 HTTP 响应头,支持Content-Type
和Cookie
。cgi.html
生成 HTML 代码,简化页面构建。- 支持文件上传、Session 处理,可用于简单的 Web 应用。
- 适用于 小型 Web 应用、轻量级 API 开发、动态网站 🚀
发表回复