あるopen-uri呼び出しからのCookieを保存し、次の呼び出しに渡したいと思います。これを行うための適切なドキュメントが見つからないようです。これを行う正しい方法を教えていただければ幸いです。
注:w3.orgは実際のURLではありませんが、より短いです。ここではクッキーが重要なふりをします。
h1 = open("http://www.w3.org/")
h2 = open("http://www.w3.org/People/Berners-Lee/", "Cookie" => h1.FixThisSpot)
2つの否定の後で更新:これは修辞的な質問として意図されていませんでしたが、私はそれが可能であることを保証します。 タンブルウィード後の更新 :(答え)を参照してください、それは可能です。しばらく時間がかかりましたが、機能します。
誰かが知っているだろうと思っていましたが、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は非常に単純なプロトコルであり、open-uri
を使用するとほとんどの場合に使用できます。私が本当に知る必要があるのは、h1
リクエストからCookieを取得して、それをh2
リクエストに渡す方法だと思います(私がすでに知っていて示した部分)。ここで驚くべきことは、基本的にopen-uri
を使用しないように言って答えたいと思った人の数であり、そのうちの1人だけが次のリクエストに渡される1つのリクエストでCookieセットを取得する方法を示しました。
「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)
MatthewSchinckelに感謝します。あなたの答えは本当に役に立ちました。 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
達成しようとしていることに応じて、 webrat をチェックしてください。通常はテストに使用されますが、ライブサイトにアクセスすることもあり、リクエスト間のCookieの保存やリダイレクトの追跡など、Webブラウザが行う多くのことを実行します。
open-uriを使用している場合は、リクエストの送信時にCookieヘッダーを読み取り、追加するときにメタヘッダーを解析して、独自のCookieサポートをロールする必要があります。 httpclient http://raa.Ruby-lang.org/project/httpclient/ または代わりにmechanizeのようなものを使用することを検討してください http://mechanize.rubyforge.org/ Cookieサポートが組み込まれています。
標準に準拠したCookieの処理が必要な場合に備えて、RFC2109およびRFC2965のCookiejar実装がここにあります。