乐闻世界logo
搜索文章和话题

如何在 ruby - net / http 中实现 cookie 支持?

2 个月前提问
2 个月前修改
浏览次数13

1个答案

1

在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-clienthttparty

2024年8月12日 12:45 回复

你的答案