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)