Ruby与互联网应用全解析
立即解锁
发布时间: 2025-08-20 01:30:33 阅读量: 1 订阅数: 3 


Ruby编程入门与实践指南
# Ruby与互联网应用全解析
## 1. 互联网协议基础
互联网在软件开发中已变得不可或缺,Ruby 提供了众多库来处理各种互联网服务。本文将重点介绍一些流行的服务,如 Web、电子邮件(POP3 和 SMTP)和 FTP,以及如何处理从互联网检索的数据。
### 1.1 HTTP 与 Web
HTTP(HyperText Transfer Protocol)是一种互联网协议,定义了 Web 服务器和 Web 客户端(如 Web 浏览器)之间的通信方式。其基本原理是,Web 上的每个资源(如网页)都有一个独特的统一资源定位符(URL),Web 客户端可以使用 HTTP “动词”(如 GET、POST、PUT 和 DELETE)来检索或操作这些资源。
### 1.2 下载网页
在 Web 上最基本的操作之一是下载单个网页或文档。下面将介绍如何使用 Ruby 中最常用的 HTTP 库 `net/http` 以及其他替代方案。
#### 1.2.1 `net/http` 库
`net/http` 库是 Ruby 的标准库,也是访问网站最常用的库。以下是一个基本示例:
```ruby
require 'net/http'
Net::HTTP.start('www.rubyinside.com') do |http|
req = Net::HTTP::Get.new('/test.txt')
puts http.request(req).body
end
```
这个示例加载了 `net/http` 库,连接到 Web 服务器 `www.rubyinside.com`,并对 `/test.txt` 执行 HTTP GET 请求,然后返回并显示该文件的内容。
为了简化操作,可以使用 Ruby 自带的 `URI` 库:
```ruby
require 'net/http'
url = URI.parse('http://www.rubyinside.com/test.txt')
Net::HTTP.start(url.host, url.port) do |http|
req = Net::HTTP::Get.new(url.path)
puts http.request(req).body
end
```
还可以使用更简单的方式:
```ruby
require 'net/http'
url = URI.parse('http://www.rubyinside.com/test.txt')
response = Net::HTTP.get_response(url)
puts response.body
```
#### 1.2.2 错误和重定向检查
在实际应用中,需要检查请求是否成功或是否发生重定向。以下是一个示例:
```ruby
require 'net/http'
def get_web_document(url)
uri = URI.parse(url)
response = Net::HTTP.get_response(uri)
case response
when Net::HTTPSuccess:
return response.body
when Net::HTTPRedirection:
return get_web_document(response['Location'])
else
return nil
end
end
puts get_web_document('http://www.rubyinside.com/test.txt')
puts get_web_document('http://www.rubyinside.com/non-existent')
```
如果响应是 `Net::HTTPSuccess` 类,则返回响应内容;如果是重定向,则使用重定向的 URL 再次调用 `get_web_document` 方法;如果既不是成功也不是重定向请求,则返回 `nil`。
#### 1.2.3 基本认证
`net/http` 支持许多 Web 服务器使用的基本认证方案,用于保护受密码保护区域的文档。示例如下:
```ruby
require 'net/http'
url = URI.parse('http://www.rubyinside.com/test.txt')
Net::HTTP.start(url.host, url.port) do |http|
req = Net::HTTP::Get.new(url.path)
req.basic_auth('username', 'password')
puts http.request(req).body
end
```
#### 1.2.4 提交表单数据
除了检索数据,还可以向 Web 服务器发送数据,例如提交表单。示例如下:
```ruby
require 'net/http'
url = URI.parse('http://www.rubyinside.com/test.cgi')
response = Net::HTTP.post_form(url, {'name' => 'David', 'age' => '24'})
puts response.body
```
也可以使用更复杂的方式:
```ruby
require 'net/http'
url = URI.parse('http://www.rubyinside.com/test.cgi')
Net::HTTP.start(url.host, url.port) do |http|
req = Net::HTTP::Post.new(url.path)
req.set_form_data({ 'name' => 'David', 'age' => '24' })
puts http.request(req).body
end
```
#### 1.2.5 使用 HTTP 代理
在某些情况下,可能需要使用 HTTP 代理进行 HTTP 请求。`net/http` 支持通过创建 HTTP 代理类来实现代理。示例如下:
```ruby
require 'net/http'
web_proxy = Net::HTTP::Proxy('your.proxy.hostname.or.ip', 8080)
url = URI.parse('http://www.rubyinside.com/test.txt')
web_proxy.start(url.host, url.port) do |http|
req = Net::HTTP::Get.new(url.path)
puts http.request(req).body
end
```
还可以根据命令行参数动态选择是否使用代理:
```ruby
require 'net/http'
http_class = ARGV.first ? Net::HTTP::Proxy(ARGV[0], ARGV[1]) : Net::HTTP
url = URI.parse('http://www.rubyinside.com/test.txt')
response = http_class.get_response(url)
puts response.body
```
#### 1.2.6 安全的 HTTP(HTTPS)
HTTP 是明文、未加密的协议,不适合传输敏感数据,如信用卡信息。HTTPS 是 HTTP 的安全版本,通过安全套接层(SSL)进行路由,确保数据在传输过程中不被第三方读取。示例如下:
```ruby
require 'net/http'
require 'net/https'
url = URI.parse('https://example.com/')
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true if url.scheme == 'https'
request = Net::HTTP::Get.new(url.path)
puts http.request(request).body
```
也可以结合表单提交代码,实现安全地向远程服务器发送敏感信息:
```ruby
require 'net/http'
require 'net/https'
url = URI.parse('https://example.com/')
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true if url.scheme == 'https'
request = Net::HTTP::Post.new(url.path)
request.set_form_data({ 'credit_card_number' => '1234123412341234' })
puts http.request(request).body
```
### 1.3 `open-uri` 库
`open-uri` 库将 `net/http`、`net/https` 和 `net/ftp` 的功能封装在一个包中,使操作更加简单。示例如下:
```ruby
require 'open-uri'
f = open('http://www.rubyinside.com/test.txt')
puts f.readlines.join
```
也可以使用块样式:
```ruby
require 'open-uri'
open('http://www.rubyinside.com/test.txt') do |f|
puts f.readlines.join
end
```
还可以直接在 `URI` 对象上使用 `open` 方法:
```ruby
require 'open-uri'
url = URI.parse('http://www.rubyinside.com/test.txt')
url.open { |f| puts f.read }
```
此外,`open-uri` 还可以获取 HTTP 响应的详细信息:
```ruby
require 'open-uri'
f = open('http://www.rubyinside.com/test.txt')
puts f.content_type
puts f.charset
puts f.last_modified
```
还可以通过提供可选的哈希参数发送额外的头字段:
```ruby
require 'open-uri'
f = open('http://www.rubyinside.com/test.txt',
{'User-Agent' => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)'})
puts f.read
```
### 1.4 生成网页和 HTML
Web 应用通常需要生成 HTML 来呈现输出。Ruby 提供了一些库来简化这个过程,如 Markaby 和 RedCloth。
#### 1.4.1 Markaby - 以 Ruby 方式生成标记
Markaby 是一个 Ruby 库,允许使用 Ruby 方法和结构创建 HTML。安装 Markaby 后,可以使用以下示例生成 HTML:
```ruby
require 'rubygems'
require 'markaby'
m = Markaby::Builder.new
m.html do
head { title 'This is the title' }
body do
h1 'Hello world'
h2 'Sub-heading'
p %q{This
```
0
0
复制全文
相关推荐










