=>実際は、200以外だったら取得しない。HTTPについては、下記サイトが非常に分かりやすいです。HTTPまた、下記のコードは独自の実装です。HttpComponentsのような有名どころのOSSを参考にすると良いかも知れません。大まかな処理はこのような感じになります。レスポンスヘッダを部分的に保存(次回のリクエスト時に使う)圧縮形式の処理は、まずリクエストの"Accept-Encoding"ヘッダにクライアントがサポートしている圧縮形式を指定します。ここでは、gzipを指定しておけば、ほとんどのサーバに対応できると思います。gzipレスポンスの"Content-Encoding"に"gzip"がセットされてきたら、レスポンスデータはGZIP圧縮されてきますので、GZIPInputStreamで読み込む必要があります。is.close"Content-Encoding"ヘッダに対するパターンマッチの最後のパターンは、ありえないケースです。gzipしか指定していないのにgzip以外で返してくるサーバが無いとは限らない*1ので、万が一そのようなレスポンスが来たら、エラーにしてしまいます。続いて、前回から更新があったかどうかを問い合わせるリクエストヘッダについてです。2616)では、大まかには"Last-Modified"と"ETag"があります。"Last-Modified"は、最終更新日時です。この値で更新有無チェックを行うには、リクエストは"If-Modified-Since"ヘッダを指定します。1123で定義されているHTTP日付(HTTP-date)を使用します。Javaの一般的なフォーマットに従えば、HTTP日付はこう表現できます。CHttpURLConnection(のスーパークラスのURLConnection)には、これをセットしてくれるメソッドがあります。skip}conn.connect"ETag"はエンティティタグと呼ばれるもので、ハッシュ関数によるダイジェスト値の文字列が返されることが多いようです。何かしらの一意になるシーケンス番号の場合もあります。フィードが更新される頻度を考えると、Javaのミリ秒でも良さそうです。この値を使って更新有無をチェックするには、前回取得した"ETag"の値をリクエストの"If-None-Match"ヘッダに指定します。Modified)が返されることが期待されます。最初に、HTTP通信のモニタリングについて。Fiddlerというツールを使うと、HTTPリクエスト&レスポンスを包括的に扱えて便利です。4大ブラウザ(IE,Firefox,Chrome,Opera)はプロキシすら不要で、それ以外もFiddlerをプロキシサーバにしてキャプチャできます。TelerikJavaやScalaからFiddlerを使う場合は、Fiddlerのプロキシサーバを起動させ、JavaとScalaからは下記のシステムプロパティを指定します。-Dhttp.proxyPort=8080今回は、このFiddlerとFirefox(ver.22)を使って通信をモニタしました。一部IEも併用しています。それでは、HTTP処理を動かしてみます......。思った以上に、期待はずれのレスポンスが返ってきます。Firefoxでも同じ動きになります。"Last-Modified"も"ETag"も帰ってこない(某動画サイト)"Last-Modified"も"ETag"も正しく処理されているように見えるのにステータスが200サーバがAp**heとか(ダミーかも?)独自ヘッダ多すぎ(後半はキャッシュ関係ない)RSSフィードは、同じページを何度も見るような性質があるのだから、この辺はちゃんとしておいたほうがいいんじゃないのかな、と思うのですが、見事に結果がバラバラです。今回確認したフィードは平均で60KB程度(非圧縮)でした。返さなかったら、無駄な通信が6MBも発生するわけですよね。ヘッダが返されないものについてはどうしようもないので放っておくとして、更新されていないのにステータス200が返った場合だけは、ダウンロードしないように自前で処理することにします。異なるフォーマットのフィードを、統一されたFeedデータオブジェクトに変換する処理を作ります。2.0、Atomを対象とします。2.0のXMLは大体こんな感じになっています。<item>(後略)ところで、Scalaは、とても簡単にXMLを処理できます。時点では、標準APIのXMLでは名前空間が使えないようです。名前空間を無視すれば、要素名(tag)は検索できますが、属性(attribute)は名前空間を無視しても検索できません。2.0、Atomのフィードをパースするコードを書いていきます。detected")}ここは簡単なコードに留めておきます。発行日時はjava.util.Date型の値を取得するため、HTTP日付のパースを行います。HTTP日付は、HTTP処理のところで登場したものと同じ書式です。ここは、パターンが固定のものとしておきます。