Web APIの次世代標準プロトコル「Atom Publishing Protocol」

第3回 リソースの操作を追う

この記事を読むのに必要な時間:およそ 7 分

おさらい

前回の最後にサービス文書についてご紹介しました。このサービス文書はコレクション及びメンバリソースを操作する上で最初の手がかりとなるものです。サービス文書内においては,collection要素で,どういったコレクションがあるのか,またそのURIは何か,が記述されていました。

では前回のサービス文書の例をもとに,リソースの操作を追っていきましょう。

フィードの取得とページング

サービス文書内で規定されているコレクションのURIは,<http://example.org/blog/main>でした。これにGETメソッドを適用するとフィード文書が得られます(以下,HTTPヘッダはリクエスト,レスポンス共に一部主要部分のみ掲載をします)。

フィード取得のためのリクエスト例

GET /blog/main HTTP/1.1
Host: example.org

するとサーバから以下のようなレスポンスが返ってきます。

フィード取得のレスポンス例

HTTP/1.1 200 Ok
Date: Fri, 8 Oct 2006 17:17:11 GMT

<feed xmlns="http://www.w3.org/2005/Atom" xmlns:app="http://www.w3.org/2007/app">
  <title>asakuraの記事一覧</title>
  <generator>feed generator version 1.0</generator>
  <icon>http://example.org/img/icon/feed.jpg</icon>
  <id>http://example.org/blog/main/1</id>
  <link rel="self" type="application/atom+xml" href="http://example.org/blog/main/1"/>
  <updated>2007-11-30T00:00:00+09:00</updated>
  <link rel="first" href="http://example.org/blog/main/1"/>
  <link rel="next"  href="http://example.org/blog/main/2"/>
  <link rel="last"  href="http://example.org/blog/main/25"/>
  <entry>
    <title>紅葉</title>
    <id>http://example.org/blog/main/article/20382</id>
    <published>2007-11-14T15:12:55+09:00</published>
    <updated>2007-11-30T00:00:00+09:00</updated>
    <app:edited>2007-11-30T00:00:00+09:00</app:edited>
    <summary>今日は紅葉を見に行きました。</summary>
    <link rel="alternate" type="text/html" href="http://example.org/blog/main/article/20382"/>
    <link rel="enclosure" type="image/png" href="http://example.org/img/fall.jpg"/>
    <link rel="edit" href="http://example.org/blog/main/1"/>
    <author>
      <name>asakura</name>
    </author>
  </entry>
  ... 同じようにエントリがあと29個続きますが割愛します ...
</feed>

ずらずらっと複数のエントリが入ったフィードが返されてきます。このときコレクションに入っているメンバリソースが少ない場合は良いのですが,多くの場合100件,200件,いやもっと多くのメンバリソースがコレクションの中に入っているかもしれません。このような場合,一度にフィードで返してしまうとサーバもクライアントも処理が大変です。このためページングの仕組みが用意されています。フィードに記述されるエントリは,サーバ側が決めたある件数以上については次のページに繰り越されます。このため次ページ,前ページ,最初のページ,最後のページを取得するためのURIが取得したフィードの中にatom:link要素として記述されています。atom:link要素はhref属性としてURIを持っています。そのURIがどのような意味を持つのかについては,rel属性にかかれています。表1にその対応をまとめてみました。

表1 ページング機能を表現するatom:link要素の一覧

rel属性の値意味
next次ページのフィード取得URIを示す
prev前ページのフィード取得URIを示す
first最初のページのフィード取得URIを示す
last最後のページのフィード取得URIを示す

app:editedとフィードにおけるエントリの順序

フィードに含まれるエントリの中には,app:editedという要素が入っているかもしれません。これは,最終更新日時を示すものです。atom:updatedも似たような要素ですが,重要な変更が行われた日時を指すもので,必ずしも全ての更新が対象ではありません。また,app:editedの値はHTTPヘッダにあるLast-Modifiedヘッダの値と同じとは限りません。

フィードの中に出てくるエントリの順番は大抵このapp:edited要素の時刻で最新のものからならんでいます。しかし実装によってはそうなっていない場合もあるので注意が必要です。

リソースの取得

では次にリソースを取得してみましょう。フィードに記載されているエントリが完全なリソースの表現であることは保障されていません。もしかしたら概要として表現されており,必須ではない要素が一部省略されているかもしれません。

取得したフィードの中から一番最初のエントリを取得してみます。

エントリ取得のためのリクエスト例

GET /blog/main/1 HTTP/1.1
Host: example.org

サーバからは指定されたエントリを取得することができます。

エントリ取得のレスポンス例

HTTP/1.1 200 Ok
Date: 

<entry xmlns="http://www.w3.org/2005/Atom" xmlns:app="http://www.w3.org/2007/app">
  <title>紅葉</title>
  <id>http://example.org/blog/main/article/20382</id>
  <published>2007-11-14T15:12:55+09:00</published>
  <updated>2007-11-30T00:00:00+09:00</updated>
  <app:edited>2007-11-30T00:00:00+09:00</app:edited>
  <content>今日は紅葉を見に行きました。もうこんな季節なんですね。でも例年よりも全然遅いそうです。</content>
  <link rel="alternate" type="text/html" href="http://example.org/blog/main/article/20382"/>
  <link rel="enclosure" type="image/png" href="http://example.org/img/fall.jpg"/>
  <link rel="edit" href="http://example.org/blog/main/1"/>
  <author>
    <name>asakura</name>
  </author>
</entry>

それぞれの要素の内容については第2回で簡単にご紹介しましたので割愛させていただきます。

著者プロフィール

朝倉浩志(あさくらひろし)

NTTコミュニケーションズ 先端IPアーキテクチャセンタ リサーチエンジニア。上位層プロトコル及びWebテクノロジの技術開発に取り組む。

コメント

コメントの記入