Ruby的open-uri和cookies

dla*_*lin 23 ruby cookies open-uri

我想从一个open-uri调用存储cookie并将它们传递给下一个.我似乎找不到合适的文档来做这件事.如果你能告诉我正确的方法,我会很感激.
注意:w3.org不是实际的网址,但它更短; 假装饼干在这里很重要.

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

2天后更新:虽然这不是一个修辞问题,但我保证这是可能的. 风滚草后更新:看(答案),这是可能的.花了我很多时间,但它的确有效.

dla*_*lin 30

我以为有人会知道,但我想这并不常见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])
Run Code Online (Sandbox Code Playgroud)

是的,它有效.不,它不漂亮,也不完全符合建议,也不处理多个cookie(按原样).

显然,HTTP是一种非常直接的协议,它open-uri可以让你完成大部分工作.我想我真正需要知道的是如何从h1请求中获取cookie,以便将其传递给h2请求(我已经知道并展示的部分).这里令人惊讶的是,有多少人基本上觉得通过告诉我不要使用来回答open-uri,只有其中一个人展示了如何在一个请求中设置cookie,并传递给下一个请求.


Mat*_*kel 13

您需要添加"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)
Run Code Online (Sandbox Code Playgroud)

  • 是的,open-uri可以发送额外的标题:open(url,"Cookie"=> cookie)#http://www.ruby-doc.org/stdlib/libdoc/open-uri/rdoc/classes/OpenURI.html (2认同)