如何在 ruby - net / http 中实现 cookie 支持?
在Ruby中使用`net/http`库进行HTTP请求时,默认情况下,它并不直接支持处理cookie。要实现cookie的支持,我们需要手动处理服务器发送的Set-Cookie头,并在后续的请求中将这些cookie发送回服务器。下面是实现这一功能的步骤和示例代码:
### 步骤1:发送初始请求并捕获cookie
首先,你需要发送一个HTTP请求到服务器,并捕获响应中的`Set-Cookie`头。
```ruby
require 'net/http'
require 'uri'
uri = URI('http://example.com/login')
response = Net::HTTP.get_response(uri)
# 初始化cookie存储
cookies = []
if response['Set-Cookie']
cookies << response['Set-Cookie'].split('; ')[0]
end
```
这里,我们将服务器发送的cookie保存在一个数组中。注意,服务器可能发送多个Set-Cookie头,因此可能需要更复杂的处理来捕获所有cookie。
### 步骤2:在后续请求中发送cookie
在捕获了cookie后,你需要在后续的请求中将它们包含在请求头中。
```ruby
uri = URI('http://example.com/data')
http = Net::HTTP.new(uri.host, uri.port)
# 创建一个HTTP请求
request = Net::HTTP::Get.new(uri.request_uri)
# 添加cookie到请求头中
request['Cookie'] = cookies.join('; ')
# 发送请求
response = http.request(request)
puts response.body
```
在这个示例中,我们创建了一个新的GET请求,并且在发送请求之前,将先前存储的cookie加入到请求头中。
### 封装成方法
为了便于重用和管理,你可以将处理cookie的逻辑封装成一个类或方法。
```ruby
class SimpleCookieClient
attr_accessor :cookies
def initialize
@cookies = []
end
def fetch(uri, method = :get)
uri = URI(uri)
http = Net::HTTP.new(uri.host, uri.port)
request = Net::HTTP::Get.new(uri.request_uri) if method == :get
# Add cookies to the request
request['Cookie'] = cookies.join('; ') unless cookies.empty?
response = http.request(request)
# Store cookies from response
response.get_fields('set-cookie').each do |value|
cookies << value.split('; ')[0]
end if response.get_fields('set-cookie')
response
end
end
# 使用示例
client = SimpleCookieClient.new
response = client.fetch('http://example.com/login')
puts response.body
response = client.fetch('http://example.com/data')
puts response.body
```
在这个类中,我们使用了一个实例变量`@cookies`来存储cookie。`fetch`方法处理发送请求的功能,并自动处理cookie的存储和发送。
### 小结
通过上述步骤和代码示例,你可以在不使用第三方库的情况下,使用Ruby的`net/http`库来处理HTTP请求中的cookie。这对于简单的脚本或学习HTTP协议的基本处理非常有用。对于更复杂的HTTP客户端应用,可能需要考虑使用支持cookie、重定向等更复杂功能的库,如`rest-client`或`httparty`。
阅读 18 · 8月14日 00:58