AtomPubな何かを作ってみよう その3 〜実装編 Part.02「単体のAtomPubリソースの動作確認」〜

前回の記事で、簡単なAtomPubのリソースをRailsで実装してみました。今回は、実装したリソースに実際にアクセスしてみたいと思います。

サービス起動

普通にRailsを起動します。

>cd path_to_projects
>ruby script/server

デフォルトで3000番ポートで起動するので、"http://localhost:3000/"でアクセスできるようになります。以下、URLは"/"以降のみ記述します。また、レスポンスのヘッダは一部のみ抜粋したものを記述します。

GET /meanings

まずは、"/meanings"に対してGETしてみます。

Status: 200 OK
Content-Type: application/atom+xml;type=feed

<?xml version="1.0" encoding="UTF-8"?>
<feed language="ja" xmlns:app="http://www.w3.org/2007/app" xmlns="http://www.w3.org/2005/Atom">
  <id>tag:tom@nadukete.name,2008:meanings</id>
  <title>単語一覧</title>
  <author>
    <name>nadukete.name</name>
  </author>
  <updated>2008-12-19T15:13:43+09:00</updated>
  <link rel="self" href="http://localhost:3000/meanings"/>
</feed>

まだ登録データが何も無いので、エントリ無しのフィードが取得されます。

POST /meanings

一つデータを登録してみます。登録するデータは、とりあえずのテストなので、以下のようなシンプルなものにしました。

<?xml version="1.0" encoding="UTF-8"?>
<entry>
	<title>作成する</title>
	<author>
		<name>TOM</name>
	</author>
	<content>テスト投稿です。</content>
</entry>

必要なデータとしては、登録する単語名/投稿者名/投稿者コメントだけというシンプルなAPIです。

Status: 201 Created
Location: http://localhost:3000/meanings/%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B
Content-Type: application/xml; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?>
<entry language="ja" xmlns:app="http://www.w3.org/2007/app" xmlns="http://www.w3.org/2005/Atom">
  <id>tag:tom@nadukete.name,2008:meanings/4</id>
  <updated>2008-12-19T15:17:51+09:00</updated>
  <author>
    <name>TOM</name>
  </author>
  <title>作成する</title>
  <content type="text">テスト投稿です。</content>
  <link rel="edit" href="http://localhost:3000/meanings/%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B"/>
</entry>

ちゃんと登録できましたね。

…と、確認をしていて気付いたんですが、レスポンスボディに投稿された内容を返すようにしているのに、"Content-Type"が"application/atom+xml;type=entry"になってないですね…。後で直そう…。

ちなみに、確認中にちょっとハマってしまったんですが、リクエストヘッダに"Content-Type: application/atom+xml;type=entry"を入れておかないといけないので注意です。この辺は、AtomPubクライアントであれば考慮されていると思いますが、一般のHTTPクライアントを使ったり、自前でAPIにアクセスするプログラムを書く時は注意が必要ですね。(そんなの常識なのかもしれませんが…。(^^;)

GET /meanings/作成する

一応、作成された記事内容がGETできるかどうか確認してみます。*1

Status: 200 OK
Content-Type: application/atom+xml;type=entry

<?xml version="1.0" encoding="UTF-8"?>
<entry language="ja" xmlns:app="http://www.w3.org/2007/app" xmlns="http://www.w3.org/2005/Atom">
  <id>tag:tom@nadukete.name,2008:meanings/4</id>
  <updated>2008-12-19T15:17:51+09:00</updated>
  <author>
    <name>TOM</name>
  </author>
  <title>作成する</title>
  <content type="text">テスト投稿です。</content>
  <link rel="edit" href="http://localhost:3000/meanings/%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B"/>
</entry>

ちゃんとエントリ一つ分が取得できました。

PUT /meanings/作成する

続いて、エントリの内容を書き換えてみましょう。上記のGETで取得した内容のコメント内容だけ書き換えたものをBODYにして、PUTしてみます。書き換え後のコメント内容は"コメント更新テストです。"にしてみましょう。

Status: 200 OK
Location: http://localhost:3000/meanings/%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B
Content-Type: application/xml; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?>
<entry language="ja" xmlns:app="http://www.w3.org/2007/app" xmlns="http://www.w3.org/2005/Atom">
  <id>tag:tom@nadukete.name,2008:meanings/4</id>
  <updated>2008-12-19T15:42:46+09:00</updated>
  <author>
    <name>TOM</name>
  </author>
  <title>作成する</title>
  <content type="text">コメント更新テストです。</content>
  <link rel="edit" href="http://localhost:3000/meanings/%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B"/>
</entry>

ちゃんとコメント部分が置き換わってますね。ただ、これもContent-Typeヘッダがよろしくないですね。(^^;ゞ ここも修正点と…。

DELETE /meanings/作成する

では、作成したエントリを削除してみましょう。

Status: 200 OK
Content-Type: text/html; charset=utf-8

ちゃんと削除できたようです。

エントリのURLに対してGETすると"404 Not Found"が返ってくる事が確認できます。

次回は?

という事で今回は、Railsで作成したAtomPubリソースに対してCRUDを一通り試してみました。

次回は、"/meanings"リソースの子リソースになる、"/meanings/{meaning}/namedwords"と、"/meanings/{meaning}/comments"リソースを作ってみたいと思います。

*1:ブラウザだと自動的にURLをUTF-8エンコードしてくれるので、日本語のままのURLでも大丈夫ですが、通常のHTTPクライアントを使う場合は、ちゃんとエンコードしたURLを使う必要があります。その為、POST後のレスポンス中ではエンコードしたURLを返すようにしています。