代码之家  ›  专栏  ›  技术社区  ›  dlamblin

Ruby的开放式URI和cookies

  •  23
  • dlamblin  · 技术社区  · 15 年前

    我想存储来自一个开放的URI调用的cookie,并将其传递给下一个。我似乎找不到合适的医生来做这个。如果你能告诉我正确的方法,我将不胜感激。
    注意:w3.org不是实际的URL,但它较短;这里假装cookies很重要。

    h1 = open("http://www.w3.org/")
    h2 = open("http://www.w3.org/People/Berners-Lee/", "Cookie" => h1.FixThisSpot)
    

    2个星期后更新 :虽然这不是用来反问的问题,但我保证这是可能的。 更新后滚草 :看(答案),这是可能的。我花了很长时间,但效果很好。

    6 回复  |  直到 13 年前
        1
  •  29
  •   dlamblin    15 年前

    我以为有人会知道,但我想这不是一般的 open-uri . 下面是一个丑陋的版本,它既不检查隐私、过期、正确的域,也不检查正确的路径:

    h1 = open("http://www.w3.org/")
    h2 = open("http://www.w3.org/People/Berners-Lee/",
              "Cookie" => h1.meta['set-cookie'].split('; ',2)[0])
    

    是的,它起作用了。不,它不漂亮,也不完全符合建议,也不处理多个cookie(原样)。

    显然,HTTP是一个非常直接的协议,并且 开放式URI 让你尽情享受吧。我想我真正需要知道的是如何从 h1 请求将其传递给 h2 请求(我已经知道并展示的部分)。令人惊讶的是,有多少人基本上喜欢告诉我不要使用 开放式URI ,其中只有一个演示了如何在传递给下一个请求的一个请求中设置cookie。

        2
  •  13
  •   Matthew Schinckel    15 年前

    您需要添加一个“cookie”头。

    我不确定open-uri是否能做到这一点,但可以使用net::http来完成。

    # Create a new connection object.
    conn = Net::HTTP.new(site, port)
    
    # Get the response when we login, to set the cookie.
    # body is the encoded arguments to log in.
    resp, data = conn.post(login_path, body, {})
    cookie = resp.response['set-cookie']
    
    # Headers need to be in a hash.
    headers = { "Cookie" => cookie }
    
    # On a get, we don't need a body.
    resp, data = conn.get(path, headers)
    
        3
  •  4
  •   Shawn Chin    13 年前

    谢谢Matthew Schinckel,你的回答真的很有用。使用net::http成功

            # Create a new connection object.
              site = "google.com"
              port = 80
              conn = Net::HTTP.new(site, port)
    
            # Get the response when we login, to set the cookie.
            # body is the encoded arguments to log in.
              resp, data = conn.post(login_path, body, {})
              cookie = resp.response['set-cookie']
    
            # Headers need to be in a hash.
              headers = { "Cookie" => cookie }
    
            # On a get, we don't need a body.
              resp, data = conn.get(path, headers)
    
              puts resp.body
    
        4
  •  2
  •   John F. Miller    15 年前

    根据你想完成的任务,来看看 webrat .我知道它通常用于测试,但它也可以访问实时网站,它可以为您的Web浏览器做很多事情,比如在请求之间存储cookie和跟踪重定向。

        5
  •  1
  •   ADAM    14 年前

    如果您使用的是开放式URI,那么在读取时必须解析元头,在提交请求时必须添加一个cookie头,这样才能滚动您自己的cookie支持。考虑使用httpclient http://raa.ruby-lang.org/project/httpclient/ 或者像机械化 http://mechanize.rubyforge.org/ 因为他们内置了cookie支持。

        6
  •  0
  •   Darwin    13 年前

    这里有一个RFC2109和RFC2965 cookie jar实现,用于是否需要标准兼容的cookie处理。

    https://github.com/dwaite/cookiejar

    推荐文章