【问题标题】:Making Ruby Net::HTTP::Get request with cookie使用 cookie 制作 Ruby Net::HTTP::Get 请求
【发布时间】:2014-04-30 21:17:56
【问题描述】:

我想通过 ruby​​ 打开我的 stackoverflow.com 页面。
而且我希望看到它就像我经过身份验证一样。

我从 Google Chrome 中获取了usr cookie 并创建了以下 sn-p:

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

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

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

【问题讨论】:

    标签: ruby-on-rails ruby cookies


    【解决方案1】:

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

    request['Cookie'] = cookie.to_s
    

    尝试使用/不使用.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
    

    更新

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

    CGI::Cookie.new('usr', 'value').to_s.sub(/; path=$/, '')
    

    【讨论】:

    • 非常感谢!在stackoverflow 仍然无法使用,但可能是我使用了错误的 cookie。我会弄清楚。再次感谢!!
    【解决方案2】:

    接受的答案是不正确的。 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="
    

    这样的代码应该会更好。

    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
    

    或者,如果您在一个哈希中有多个 cookie:

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

    【讨论】:

    • 很高兴指出这一点。我错过了。我更新了答案以解决该问题。谢谢。
    • 出于好奇,你为什么这么坚持CGI::Cookie,当你仍然必须在之后操作#to_s 输出时,我看不到任何好处
    • 它来自原始问题。我的意思是使用to_s 来获取字符串。顺便说一句,使用CGI::Cookie,你不需要自己调用CGI.encode。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 2012-01-16
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多