おさらい
前回の最後にサービス文書についてご紹介しました。このサービス文書はコレクション及びメンバリソースを操作する上で最初の手がかりとなるものです。サービス文書内においては、
では前回のサービス文書の例をもとに、
フィードの取得とページング
サービス文書内で規定されているコレクションの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要素の時刻で最新のものからならんでいます。しかし実装によってはそうなっていない場合もあるので注意が必要です。
リソースの取得
では次にリソースを取得してみましょう。フィードに記載されているエントリが完全なリソースの表現であることは保障されていません。もしかしたら概要として表現されており、
取得したフィードの中から一番最初のエントリを取得してみます。
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回で簡単にご紹介しましたので割愛させていただきます。
リソースの追加
リクエスト
リソースの追加を行う場合には、
メディアリソースを追加する際にバイナリデータをそのまま
以下にエントリリソース追加のための例をご紹介します。
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ヘッダ
また、
SlugヘッダはHTTPヘッダの一部であるため、
レスポンス
成功した場合の帰り値は必ず201 Createdになります。このとき、
メディアリソースを追加した場合は、
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>
返ってくるエントリはPOSTした際のエントリの内容と異なるかもしれません
特にサーバはatom:id要素やatom:updated要素などの内容について、
メンバリソースURIの取得
今後、
メディアリンクエントリが返ってくる場合も同様で、
表2にメンバリソースURIをどこから取得したら良いかについてまとめてみました。
通常のエントリリソースを追加した場合は、
メディアリソースを追加した場合は、
メンバリソースURI | 出現条件 | 記載されている場所 |
---|---|---|
A.生成されたエントリリソースURI | MUST | Locationヘッダ |
SHOULD | atom:link要素 | |
B.生成されたメディアリソースを参照するためのURI | MUST | atom:content要素のsrc属性 |
C.生成されたメディアリソースURI | SHOULD | atom:link 要素 |
AtomPubの仕様ではatom:link要素
メディアリソースをPOSTした場合もメディアリンクエントリはLocationヘッダで必ず返されます。そして、
リソースの更新
リクエスト
リソースの更新はPUTを使って行うことができます。PUTのbody部分には、
メディアリソースを更新する場合は、
以下にエントリリソースを更新するPUTの例をご紹介します。この例では、
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
レスポンス
成功した場合は200 OKが返ります。失敗した場合は、
HTTP/1.1 200 Ok
Date: Sun, 18 Nov 2007 23:50:13 JST
認証
本連載では認証については全く触れてきませんでした。しかし、
実際のAtomPubサーバはBasic認証以外の認証をサポートすることも多いと思います。色々な方法があると思いますが、
エラー
AtomPubはHTTPベースのプロトコルですので、
まとめ
駆け足でAtomを見てきましたが、
AtomPubの本質はREST的なCRUD操作をAtomフィードを使って定義したところにあります。これさえ押さえてしまえば理解したも同然です。しかし、
必ずしも全てのwebサービスがこのコレクションとメンバリソースのモデルに親和性があるわけではありませんが、
次回は最後の連載になります。著者を交代しまして、