使用cookie制作Ruby Net :: HTTP :: Get请求

Ale*_*lov 8 ruby cookies ruby-on-rails

我想通过ruby打开我的stackoverflow.com页面.
而且我希望看到它好像我已经过身份验证.

usr从Google Chrome中获取了Cookie并创建了以下代码段:

require 'net/http'
require 'cgi'

url = "http://stackoverflow.com/users/1650525/alex-smolov"
uri = URI(url)
http = Net::HTTP.new(uri.host, 80)
request = Net::HTTP::Get.new(uri.request_uri)

cookie = CGI::Cookie.new("usr", "[my cookie is here]")
request['Cookie'] = cookie
r = http.request(request)
puts r.body
Run Code Online (Sandbox Code Playgroud)

它确实输出了一个页面,但我没有在那里进行身份验证.

是否可以使用cookie在Ruby中创建Net :: HTTP :: Get请求?

fal*_*tru 10

你需要调用CGI::Cookie.to_s方法.

request['Cookie'] = cookie.to_s
Run Code Online (Sandbox Code Playgroud)

尝试使用/不使用以下代码.to_s.

require 'net/http'
require 'cgi'

uri = URI("http://httpbin.org/cookies")
http = Net::HTTP.new(uri.host, 80)
request = Net::HTTP::Get.new(uri.request_uri)
cookie1 = CGI::Cookie.new('usr', 'blah')
request['Cookie'] = cookie1.to_s # <---
r = http.request(request)
puts r.body
Run Code Online (Sandbox Code Playgroud)

UPDATE

正如提到的另一个答案,结果字符串用于服务器输出.你需要去除; path=部分.

CGI::Cookie.new('usr', 'value').to_s.sub(/; path=$/, '')
Run Code Online (Sandbox Code Playgroud)


gra*_*olf 5

接受的答案是不正确的。CGI::Cookie#to_s生成应由SERVER发送到客户端的字符串,而不是Net :: HTTP应该使用的字符串。可以很容易地证明:

[1] pry(main)> require 'cgi'
=> true
[2] pry(main)> CGI::Cookie.new('usr', 'value').to_s
=> "usr=value; path="
Run Code Online (Sandbox Code Playgroud)

这样的代码应该更好地工作。

require 'net/http'
require 'cgi'

uri = URI("http://httpbin.org/cookies")
http = Net::HTTP.new(uri.host, uri.port)
request = Net::HTTP::Get.new(uri.request_uri)
request['Cookie'] = "usr=#{CGI.encode cookie_value}"
r = http.request(request)
puts r.body
Run Code Online (Sandbox Code Playgroud)

或者,如果您在哈希中包含多个Cookie:

h = {'cookie1' => 'val1', 'cookie2' => 'val2'}
req['Cookie'] = h.map { |k,v| "#{k}=#{CGI.encode v}" } .join('; ')
Run Code Online (Sandbox Code Playgroud)