(整理)RUBY的CGI访问

来源:互联网 发布:java if while嵌套语句 编辑:程序博客网 时间:2024/05/16 06:14
  
CGI的工作原理介绍:CGI(Common Gateway Interface)是一个WEB服务器提供信息服务的标准接口,通过这样一个接口,WEB服务器能够执行程序,并将程序输出的信息返回给浏览器。因为在WEB网上的数据都是静态的,通过CGI程序能够动态的处理浏览者的请求,如保存用户输入的信息,根据用户信息返回相关的资料等等。当客户端发送一个CGI请求给WEB服务器后,WEB服务器将根据CGI程序的类型决定数据向CGI程序的传送方式,一般来讲是通过标准输入/输出流和环境变量来与CGI程序间传递数据。
 
CGI输入输出原理
 
  CGI的输入/输出方法:CGI程序通过标准输入(STDIN)和标准输出(STDOUT)来进行输入输出,STDIN和STDOUT是两个预先定义好的文件指针。你可以利用文件读写函数来对其进行操纵。
GET方法将数据附加在URL后发送,如:/cgi/a_cgi_test.exe?your_data,CGI程序通过检查环境变量QUERY_STRING来得到输入数据。而POST方法则会将数据送入CGI程序的STDIN输入流。
 
表单里面POST和GET的区别。
在B/S 应用程序中,前台与后台的数据交互,都是通 过HTML中 Form表 单完成的。Form 提供了两种数据传输 的方式—— get和 post。 虽然它们 都是数据的提交方式,但是在实际传输时 确有很大的不同,并且可能会对数据 产生 严重的影响。 虽然为 了方便的得到变 量值, Web容器已 经屏蔽了二者的一些差异,但是了解二者的差异在以后的编 程也会很有帮助的。
Form中的 get和 post方法,在数据传输过 程中分别对应 了HTTP 协议中的GET 和POST 方法。二者主要区别如下:
1、 Get是用来从服 务器上获 得数据,而Post 是用来向服务 器上 传递数据。
 2 、Get将表 单中数据的按照 variable=value的形式,添加到action 所指向的URL后面,并且两者使用" ?"连 接,而各个变量之 间使用" &"连接; Post是将表单 中的数据放在form的数据体中,按照 变量和 值相对应 的方式,传递到 action所指向URL
  3 、Get 是不安全的,因为在 传输过程,数据被放在 请求的URL 中,而如今现 有的很多服务器、代理服 务器或者用 户 代理都会将请 求URL 记录到日志文件中,然后放在某个地方,这样 就可能会有一些隐 私的信息被第三方看到。另外,用户也可以在浏览 器上直接看到提交的数据,一些系统 内部消息将会一同显示在用 户面前。 Post的所有操作对 用户 来说都是不可 见的
4、 Get传输 的数据量小,这主要是因 为受 URL 长度限制;而 Post可以 传输大量的数据,所以在上传 文件只能使用Post (当然还 有一个原因,将在后面的提到)
 5、 Get限制 Form表单 的数据集的 值 必须为ASCII 字符;而Post 支持整个ISO10646 字符集
6 、Get是 Form的默 认方法
 
Ruby实现代码:
#!/ruby/bin/ruby –Ks

require 
"cgi.rb"
require 
"cgi/session"
def root_init()
 $doc 
= CGI.new
$ses 
= CGI::Session.new($doc)
basename 
= File.basename(filename)
= open(filename)
header 
= {"Content-type" => "application/oct-stream"
        
"Content-Disposition"=>"attachment;filename=#{basename}"}
f.binmode
$doc.out(header) {
    f.read
}
f.close
End
=begin
-------------------------------------------------
Method   :main_has_argv
Summary  :画面で名前を指定したコントロールのオブジェクトを存在するかどうか
Parameter:key
Return   :true 存在
          false 不存在
-------------------------------------------------
=end
def main_has_argv(key)
 
return $doc.params.key?(key)
end

=begin
-------------------------------------------------
Method   :has_argv
Summary  :画面から値を取得する
Parameter:key 
Return   : ret コントロールのオブジェクトの値
-------------------------------------------------
=end
def has_argv(key)
 value 
= $doc.params[key][0]
 
if defined?(value.read)
   ret 
= value.read || ""
 
else
   ret 
=  value || ""
 end
 
return ret
end