おさらい
前回の最後にサービス文書についてご紹介しました。このサービス文書はコレクション及びメンバリソースを操作する上で最初の手がかりとなるものです。サービス文書内においては、
では前回のサービス文書の例をもとに、
フィードの取得とページング
サービス文書内で規定されているコレクションのURIは、
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>
ずらずらっと複数のエントリが入ったフィードが返されてきます。このときコレクションに入っているメンバリソースが少ない場合は良いのですが、
rel属性の値 | 意味 |
---|---|
next | 次ページのフィード取得URIを示す |
prev | 前ページのフィード取得URIを示す |
first | 最初のページのフィード取得URIを示す |
last | 最後のページのフィード取得URIを示す |
app:editedとフィードにおけるエントリの順序
フィードに含まれるエントリの中には、 フィードの中に出てくるエントリの順番は大抵このapp:edited要素の時刻で最新のものからならんでいます。しかし実装によってはそうなっていない場合もあるので注意が必要です。 では次にリソースを取得してみましょう。フィードに記載されているエントリが完全なリソースの表現であることは保障されていません。もしかしたら概要として表現されており、 取得したフィードの中から一番最初のエントリを取得してみます。 サーバからは指定されたエントリを取得することができます。 それぞれの要素の内容については第2回で簡単にご紹介しましたので割愛させていただきます。 リソースの追加を行う場合には、 メディアリソースを追加する際にバイナリデータをそのまま 以下にエントリリソース追加のための例をご紹介します。 また、 SlugヘッダはHTTPヘッダの一部であるため、 成功した場合の帰り値は必ず201 Createdになります。このとき、 メディアリソースを追加した場合は、 返ってくるエントリはPOSTした際のエントリの内容と異なるかもしれません 特にサーバはatom:id要素やatom:updated要素などの内容について、 今後、 メディアリンクエントリが返ってくる場合も同様で、 表2にメンバリソースURIをどこから取得したら良いかについてまとめてみました。 通常のエントリリソースを追加した場合は、 メディアリソースを追加した場合は、 AtomPubの仕様ではatom:link要素 メディアリソースをPOSTした場合もメディアリンクエントリはLocationヘッダで必ず返されます。そして、 リソースの更新はPUTを使って行うことができます。PUTのbody部分には、 メディアリソースを更新する場合は、 以下にエントリリソースを更新するPUTの例をご紹介します。この例では、 この結果、 成功した場合、 この例では、 また、 エントリリソースを更新する場合、 また、 エントリリソースを更新する場合、 リソースの削除は、 成功した場合は200 OKが返ります。失敗した場合は、 本連載では認証については全く触れてきませんでした。しかし、 実際のAtomPubサーバはBasic認証以外の認証をサポートすることも多いと思います。色々な方法があると思いますが、 AtomPubはHTTPベースのプロトコルですので、 駆け足でAtomを見てきましたが、 AtomPubの本質はREST的なCRUD操作をAtomフィードを使って定義したところにあります。これさえ押さえてしまえば理解したも同然です。しかし、 必ずしも全てのwebサービスがこのコレクションとメンバリソースのモデルに親和性があるわけではありませんが、 次回は最後の連載になります。著者を交代しまして、リソースの取得
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>
リソースの追加
リクエスト
POST /blog/main HTTP/1.1
Host: example.org
Content-Type: application/atom+xml;type=entry
Content-Length: nnn
Slug: the first snow of this season
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:app="http://www.w3.org/2007/app">
<title>初雪</title>
<id></id>
<updated>2007-11-18T10:00:00+09:00</updated>
<app:edited>2007-11-18T10:00:00+09:00</app:edited>
<content>今日は寒いです。日本列島の中ではどこかは初雪を観測したところがあるんじゃないかな。</content>
<author>
<name>asakura</name>
</author>
</entry>
Slugヘッダ
レスポンス
HTTP/1.1 201 Created
Date: Sat, 18 Nov 2007 10:10:23 JST
Content-Length: XXX
Content-Type: application/atom+xml;type=entry;charset="utf-8"
Location: http://example.org/blog/main/2
<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/73821</id>
<published>2007-11-18T10:10:21+09:00</published>
<updated>2007-11-18T10:10:21+09:00</updated>
<app:edited>2007-11-18T10:00:00+09:00</app:edited>
<content>今日は寒いです。日本列島の中ではどこかは初雪を観測したところがあるんじゃないかな。</content>
<link rel="alternate" type="text/html" href="http://example.org/blog/main/article/73821"/>
<link rel="edit" href="http://example.org/blog/main/2"/>
<author>
<name>asakura</name>
</author>
</entry>
メンバリソースURIの取得
メンバリソースURI 出現条件 記載されている場所 A.生成されたエントリリソースURI MUST Locationヘッダ SHOULD atom:link要素 B.生成されたメディアリソースを参照するためのURI MUST atom:content要素のsrc属性 C.生成されたメディアリソースURI SHOULD atom:link 要素 リソースの更新
リクエスト
PUT /blog/main/2 HTTP/1.1
Host: example.org
Content-Type: application/atom+xml;type=entry
Content-Length: XXX
<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/73821</id>
<published>2007-11-18T10:10:21+09:00</published>
<updated>2007-11-18T10:10:21+09:00</updated>
<app:edited>2007-11-18T12:10:34+09:00</app:edited>
<content>今日は寒いです。日本列島の中ではどこかは初雪を観測したところがあるんじゃないかな。・・・と思ったら本当に降ってたみたいですね。</content>
<link rel="alternate" type="text/html" href="http://example.org/blog/main/article/73821"/>
<link rel="edit" href="http://example.org/blog/main/2"/>
<author>
<name>asakura</name>
</author>
</entry>
レスポンス
HTTP/1.1 200 Ok
Date: Sat, 18 Nov 2007 10:35:11 JST
Content-Length: XXX
Content-Type: application/atom+xml;type=entry;charset="utf-8"
<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/73821</id>
<published>2007-11-18T10:10:21+09:00</published>
<updated>2007-11-18T10:35:08+09:00</updated>
<app:edited>2007-11-18T12:10:34+09:00</app:edited>
<content>今日は寒いです。日本列島の中ではどこかは初雪を観測したところがあるんじゃないかな。・・・と思ったら本当に降ってたみたいですね。</content>
<link rel="alternate" type="text/html" href="http://example.org/blog/main/article/73821"/>
<link rel="edit" href="http://example.org/blog/main/2"/>
<author>
<name>asakura</name>
</author>
</entry>
他の名前空間に属する要素の扱い
PUTした内容の扱い
リソースの削除
リクエスト
DELETE /blog/main/2 HTTP/1.1
Host: example.org
レスポンス
HTTP/1.1 200 Ok
Date: Sun, 18 Nov 2007 23:50:13 JST
認証
エラー
まとめ