用Ruby进行CGI编程的入门指引
编写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>'