Ruby 的 CGI 库用于处理 Web 服务器的 CGI(Common Gateway Interface)请求,提供了丰富的方法来解析请求参数、生成 HTML、处理 Cookie、Session、文件上传等。


📌 目录

  1. 🔹 CGI 类简介
  2. 🔹 CGI 请求处理方法
  3. 🔹 生成 HTTP 头部
  4. 🔹 处理 HTML 响应
  5. 🔹 处理表单参数(GET/POST)
  6. 🔹 处理 Cookie
  7. 🔹 处理文件上传
  8. 🔹 处理 Session
  9. 🔹 CGI 调试与错误处理
  10. 🔹 参考资料

🔹 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/htmlHTML 网页
text/plain纯文本
application/jsonJSON 数据
application/xmlXML 数据
image/pngPNG 图片

🔹 处理 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-TypeCookie
  • cgi.html 生成 HTML 代码,简化页面构建。
  • 支持文件上传、Session 处理,可用于简单的 Web 应用。
  • 适用于 小型 Web 应用、轻量级 API 开发、动态网站 🚀