2008年8月5日火曜日

身に沁みてわかった REST

あるクライアントのケータイサイトでのお話です。

ユーザはサイト上に自分のポートフォリオを作れて、サイトで取り扱われているアイテムで気になるものがあれば、そこにどんどん追加していけるという機能がありまして。

アイテムにはそれぞれ詳細情報のページが用意されているんですけど、そのリンク集を、サイト上に作っておけるってわけですね。

そのアイテムの性質上、まあ、何度かその詳細情報を確認したくなることはありえて、でも、そのたびに検索するのも面倒臭いだろう、と、一方、そのサイトはキャリアの公式メニューに入ってるんで、端末 ID ベースでそうしたパーソナライズを行うんでも、ユーザに手間をとらせることもないからいいんじゃない、ということで。

で、それはいいんですけど、キャリアの公式メニューの検索窓にあるアイテム名を入力して検索すると、そのアイテムの詳細ページではなくて、ポートフォリオのページがヒットしちゃうってことを、今日、クライアントからつっこまれました。

検索結果から、そのリンクをたどって、ポートフォリオのページにアクセスすると、前にこのサイトでポートフォリオを作ったことがあれば、かつて登録したアイテムの一覧が、そうじゃなければ、ポートフォリオにアイテムを登録しましょう、ってなインストラクションが表示される。だから、たいてい、検索キーワードとはまったく関係のないページが表示されてしまって、これはいかんですね。

でも、なんで、そんなことになっちゃうの?

まず、キャリア公認のロボットって、ちゃんと端末 ID つきでクロールしてくるわけですね。

それで、ポートフォリオにアイテムを追加するリクエストを、フォームじゃなくて、リンクで書いてたんですよね。だから当然そこもクロールしてくれて、すると、クロールしたときに、ロボットの端末 ID でポートフォリオができちゃってた。

そのあとで、ポートフォリオのページもクロールして、そこは、前にロボットが登録したアイテムが表示されている状態ですから、そのアイテム名がキーワードになってインデキシングされていたと。

おそらく、ざっと、そんなかんじだろうなと、パートナーのプログラマーが解説してくれました。

ぼくは、ロボットが自分のポートフォリオを拵えてるなんて、いやーなかなかファンタスティックですなあ、なんてのんきなことをいってたんですけど、プログラマーは、いやいや、これは、本来 REST でいえば POST でやるべきポートフォリオへのアイテムの登録を、デザインの調和の問題とかいって強引にアンカータグで書いて GET にしたのがいけなかった。GET メソッドは、いうまでもなく URI で特定されたリソースの取得、これをロボットが取り込もうとするのは当然のこと。ちなみにこの場合、ポートフォリオへの追加が PUT ではなく POST なのは、リクエスト側が持っている情報が追記分にすぎず、それをもってポートフォリオ全体を差し替えることはできないから。つまり、データ操作機能をあらわす URI に POST メソッドでデータを引き渡し、追記作業を依頼すべきだから。まあ、そもそも PUT メソッドなんてキャリアがサポートしてないんですけどね。といったような意味をたぶん込めて一言、やっぱりあそこはふつうにフォームで POST にしとくべきでしたね。といってました。

ほんとは、あとで、イントラに公開されている彼の業務日誌 Wiki に、この件について以上のような REST 的な問題が指摘されているのを読んで、いやあ今回はいつになく身に沁みて REST のことがわかっちゃったなあ、と、しみじみ感じ入ったのでした!

ちなみに、今回の件については、robots.txt で対応することにしました。
-----------------
sent from W-ZERO3

0 件のコメント: