XPathでRESTfulなURL設計を考えてみる

Posted by Hiraku on 2010-09-14

WebAPIまたはWebサービスを作るときに、考えないといけないのがURL設計です。
近年は「Cool URL」と称して、短いURLを設計するのが流行りです。例としては、twitterの各ユーザーページのURLは「/user?user={ユーザーID}」などではなく、「/{ユーザーID}」になっています。
例:http://twitter.com/Hiraku
究極に短いURLですね。

ただ、ここまで短くしてしまうと困ることがあります。
twitterの場合だと、検索用のURL「/search」やオプション設定の「/settings/...」などは特例であり、ユーザーIDを指していません。これは、searchやsettingsという名前のユーザーを作ることができないことを意味します。拡張性が犠牲になってしまったんですね。。。

twitterほど極端なURL設計にせず、わかりやすく、自然に設計するための指針ってないかと、いくつか候補を考えてみました。今回はXPathを取り入れたパターンです。たぶん、考え方としては一番シンプルだと思うんですが、、まぁ、見てください。

XML+XPathの概念を使ってURLを設計する

  • 「/(ルート)」配下にデータすべてを含む巨大なXMLが存在すると考える
  • XPathでXMLを絞り込んだ結果をリソースと考え、そのXPathをそのままURLにする

文面だけだとわかりづらいので、twitterクローン「しょぼったー(shobotter)」のWebAPIを考えてみます。



例:http://sample.com/shobotter

しょぼったーのルートノードには、しょぼったーに関するすべての情報がつまったXMLが存在します。


<?xml version="1.0" encoding="UTF-8"?>
<shobotter>
 <status id="1234">
  <text>今起きたなう</text>
  <date>2010-01-01</date>
  <user>
   <name>shobo</name>
   <icon>http://sample.com/shobo.png</icon>
  </user>
 </status>
 <status id="1235">
  <text>お昼ごはんなう</text>
  <date>2010-01-01</date>
  <user>
   <name>shakin</name>
   <icon>http://sample.com/shakin.png</icon>
  </user>
 </status>
 ...
</shobotter>

それぞれの投稿内容には一意なIDが振られています。id=1234のstatusをXPathで書くとこうなります。(他にも書き方はありますが、ここでは下記を採用します)

/shobotter/status[@id=1234]

これを、status 1234を示すURLにします。

例:http://sample.com/shobotter/status[@id=1234]


<?xml version="1.0" encoding="UTF-8"?>
<collection>
 <status id="1234">
  <text>今起きたなう</text>
  <date>2010-01-01</date>
  <user>
   <name>shobo</name>
   <icon>http://sample.com/shobo.png</icon>
  </user>
 </status>
</collection>

XPathの演算結果はノードのリストなので、ルートノードの名前はcollectionとしてみました。こんな感じでXPath=URLの法則を決めると、部分木はすべてびしっと書くことができます。

例:http://sample.com/shobotter//user

これはユーザーの一覧を返すURLです。


<?xml version="1.0" encoding="UTF-8"?>
<collection>
 <user>
  <name>shobo</name>
  <icon>http://sample.com/shobo.png</icon>
 </user>
 <user>
  ...
 </user>
 ...
</collection>

ここまではURLが何を示すか、すなわちGETの問い合わせ結果のみを考えていますが、同様に更新や新規作成も考えることができます。

RESTの考え方に基づけば、リソースの新規作成は集合リソースに対して、POSTでappendするのでした。すなわち、「しょぼったーにつぶやきを追加する」は、statusの一覧を表すURLにPOSTしてやればよいのです。

例:POST http://sample.com/shobotter/status


<?xml version="1.0" encoding="UTF-8"?>
<status>
 <text>疲れたなう</text>
 <user>
  <name>shakin</name>
 </user>
</status>

PUTによる更新や、DELETEによる削除なども同様です。以下省略。

まとめなど

データが規則正しくツリー構造をしている場合は、この方式が非常にわかりやすいし作りやすいと思います。しかし、user対statusの関係が多対多で、どちらを親にすることもできる、となるとやりづらくなります。

困ったときは、ツリー構造を組み替えたXMLを別のURLで考えてあげないといけないかもしれません。。

もっと自由度が高くなるように、リレーショナルデータベースの考え方をそのままURL設計に活かせないかなぁと考えて、ちょっと作っているものがあります。またできあがったら報告します。



keyword: XPath RESTful Rest

architectureの最新記事

×

この広告は180日以上新しい記事の投稿がないブログに表示されております。