HTTP GETでサーバ側キャッシュ無効化
Ruby標準添付ライブラリRSS::Parserでは、RSS::Parser.parse(url) という形で直接HTTP経由でRSSフィードを読み込むこともできますが、少なくともはてなブックマークのRSSでは、サーバ側キャッシュの影響で、最新のエントリが取得できないケースがあるようです。
wgetコマンドでは --no-cache というオプションがあり、これを指定すると期待通り最新のエントリを取得できるので、HTTPリクエストヘッダでキャッシュ無効化 (Cache-Control: no-cacheあるいはPragma: no-cache) を指定すれば期待通りの挙動になりそうです。
RSS::Parser.parserではHTTPリクエストヘッダを指定する手段はないようですが、ひとまずNet::HTTPやopen-uriでは任意のヘッダを指定できるので、これらのライブラリを試してみました。結論としてはどちらもOK。RSS::Parserへの入力として使う目的では、どちらでも大差はなさそうです。
情報源:
- Rubyリファレンスマニュアル>open-uri
- Rubyリファレンスマニュアル>net/http
- RFC 2616 - Hypertext Transfer Protocol HTTP/1.1 (14.9 Cache-Control, 14.32 Pragma)
Net::HTTP
require 'net/http' response = nil Net::HTTP.version_1_2 Net::HTTP.start('b.hatena.ne.jp') {|http| response = http.get(<パス>, {'Cache-Control' => 'no-cache', 'Pragma' => 'no-cache'}) } print response.body if response.kind_of?(Net::HTTPOK)
open-uri
require 'open-uri' result = nil open(<URL>, {'Cache-Control' => 'no-cache', 'Pragma' => 'no-cache'} {|f| result = f.read } print result