欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

用Ruby进行CGI编程的入门指引

程序员文章站 2022-08-29 19:26:20
编写cgi脚本: 最基本的ruby cgi脚本看起来像这样: #!/usr/bin/ruby puts "http/1.0 200 ok" puts "...

编写cgi脚本:

最基本的ruby cgi脚本看起来像这样:

#!/usr/bin/ruby

puts "http/1.0 200 ok"
puts "content-type: text/html\n\n"
puts "<html><body>this is a test</body></html>"

如果调用这个脚本 test.cgi 上传到基于unix/linux的web托管服务提供商并具有合适的权限,那么可以将它作为一个cgi脚本使用。

例如,如果有一个linux的web托管服务提供商托管的网站,如:http://www.yiibai.com/test.cgi 的主目录,并给它执行权限,那么访问 http://www.yiibai.com/test.cgi 应该返回一个html页面显示:this is a test.

这里时当 test.cgi 从web浏览器请求,web服务器看执行使用ruby解释器它。 ruby脚本返回一个基本的http头,然后返回一个基本的html文档。
使用 cgi.rb:

ruby有一个特殊的称为cgi库,使更复杂的交互相比前面的cgi脚本。

让我们创建一个基本的cgi使用cgi脚本:

#!/usr/bin/ruby

require 'cgi'

cgi = cgi.new
puts cgi.header
puts "<html><body>this is a test</body></html>"

在这里,创建了一个cgi对象,并用它来打印标题行。
表单处理:

使用cgi类使可以访问html查询参数有两种方法。假设我们给出 /cgi-bin/test.cgi?firstname=zara&lastname=ali.

可以访问参数firstname和lastname使用cgi#[]如下:

#!/usr/bin/ruby

require 'cgi'
cgi = cgi.new
cgi['firstname'] # => ["zara"]
cgi['lastname'] # => ["ali"]

还有另一种方法来访问这些表单变量。此代码会给出所有的项和值的哈希值:

#!/usr/bin/ruby

require 'cgi'
cgi = cgi.new
h = cgi.params # => {"firstname"=>["zara"],"lastname"=>["ali"]}
h['firstname'] # => ["zara"]
h['lastname']  # => ["ali"]

以下是代码来检索所有的键:

#!/usr/bin/ruby

require 'cgi'
cgi = cgi.new
cgi.keys     # => ["firstname", "lastname"]

如果表单包含多个具有相同名称的字段,对应的值将被返回到脚本中为一个数组。[]存取器返回这些的只是第一个。

在这个例子中,假设名为“name”的表单有三个字段,我们输入了三个名字 "zara", "huma" and "nuha":

#!/usr/bin/ruby

require 'cgi'
cgi = cgi.new
cgi['name']    # => "zara"
cgi.params['name'] # => ["zara", "huma", "nuha"]
cgi.keys      # => ["name"]
cgi.params     # => {"name"=>["zara", "huma", "nuha"]}

注:ruby的会自动处理get和post方法。没有单独的处理这两种不同的方法。

一个相关的,但基本形式,可以发送正确的数据,将有html代码,就像这样:

<html>
<body>
<form method="post" action="http://www.example.com/test.cgi">
first name :<input type="text" name="firstname" value="" />
<br />
last name :<input type="text" name="lastname" value="" /> 

<input type="submit" value="submit data" />
</form>
</body>
</html>

创建表单和html:

cgi包含大量的方法用于创建html。会发现每个标签的方法之一。为了使这些方法,必须通过调用cgi.new创建一个cgi对象。

为了使标签更容易嵌套,这些方法拿自己的内容作为代码块。代码块返回一个字符串,这将在作为标签的内容。例如:

#!/usr/bin/ruby

require "cgi"
cgi = cgi.new("html4")
cgi.out{
  cgi.html{
   cgi.head{ "\n"+cgi.title{"this is a test"} } +
   cgi.body{ "\n"+
     cgi.form{"\n"+
      cgi.hr +
      cgi.h1 { "a form: " } + "\n"+
      cgi.textarea("get_text") +"\n"+
      cgi.br +
      cgi.submit
     }
   }
  }
}

注:cgi类的方法可以接受的方法参数,这将设置http方法(get,post等)上使用的表单提交。缺省情况下,在这个例子中使用的是post。

这将产生以下结果:

content-type: text/html
content-length: 302
<!doctype html public "-//w3c//dtd html 4.0 final//en">
<html>
<head>
<title>this is a test</title>
</head>
<body>
<form method="post" enctype="application/x-www-form-urlencoded">
<hr>
<h1>a form: </h1>
<textarea cols="70" name="get_text" rows="10"></textarea>
<br>
<input type="submit">
</form>
</body>
</html>

引用字符串:

当处理url和html代码,您必须谨慎地引用一些字符。例如,一个斜杠字符(/)在url中具有特殊的意义,所以它必须被转义,如果它不是部分路径名。

例如,/查询url部分将被翻译成字符串%2f/,使用它时必须翻译。空间和与符号特殊字符。为了处理这个问题,cgi提供:在例行程序 cgi.escape 和 cgi.unescape.

#!/usr/bin/ruby

require 'cgi'
puts cgi.escape(zara ali/a sweet & sour girl")

这将产生以下结果:

zara+ali%2fa sweet+%26+sour+girl")

#!/usr/bin/ruby

require 'cgi'
puts cgi.escapehtml('<h1>zara ali/a sweet & sour girl</h1>')

这将产生以下结果:

<h1>zara ali/a sweet & sour girl</h1>'