トラックバックの実装
トラックバックの実装の説明です。トラバの意味がわからなかった人も、どうぞ。私もこのたび初めて知りました。
私は長年、「トラックバック」という言葉に怯えてました。
なんだかチョー技術的な香りがするし。いちおう、IT業界で働いてる身で、「トラバって何?」とは、真鍋かおりですら理解しているかと思うと、今さら聞けないし。
「トラックバック」っていう言葉の響きがよくないのでは・・。
「おねがいリンク」とか「ともだちリンク」とか、もうちょっと優しい言葉にしたらいいのにな。
・・ということで、ブログ作りをきっかけに、本気になって調べてみたら、気が抜けるほど単純なしくみでした。
トラックバックを送る

トラックバックというのは、この絵の「わたしと沢田さんの会話と行動」を自動的にやるしくみです。以下、実装方法の解説です。
「1.トラックバックを送る」では、わたしの方から沢田さんのURLに、次のHTTPリクエストを送信します。日本語はUTF8で、URLエンコードするのがキマリのようです。
POST http://www.sawada.san/trackback/12
Content-Type: application/x-www-form-urlencoded
title=私の記事
&url=私の記事のURL
&excerpt=記事の要約
&blog_name=私のブログサイト名
RubyAPIのNet::HTTPを使うなら、こんなコードになります。
request = Net::HTTP::Post.new("/trackback/12")
request["Content-Type"] = "application/x-www-form-urlencoded"
Net::HTTP.start( "www.sawada.san", 80 ) do |http|
response, = http.request( request,\
CGI::escape("title=xxx&url=xxx&...") )
end
「2.リンクをはる」は、沢田さんが全部やってくれるので、わたしは何もしない。「3.結果」を沢田さんが返してきます。
次のようなXMLフォーマットで。
<response>
<error>0 or 1(成功か失敗)</error>
<message>エラー理由など</message>
</response>
わたしは、その結果を見て、「良かった」と思うか「残念だ」と思うか、どちらかです。特に何も行動しなくていいでしょう。親切なブログサイトでは、なんでエラーになったのかをmessageに書いてくれるので、結果のXMLは保存しておきます。
簡単ですよね。もしわかりづらければ、ブラウザから、自分のブログのトラックバックURLを入力してみればいいでしょう。必須パラメータはurlだけです。
http://your.test.blog/trackback/10?url=xxxx
トラックバックを受け取る
今度は、立場が逆の場合。沢田さんがトラックバックを送って、わたしが受け取ります。
わたしがやらなければならない仕事は、
- 1.トラックバックを受け取る
- 2.リンクを貼る
- 3.結果を返す
「1.トラックバックを受け取る」ための受け口になるアクションを用意します。
class BlogController < ActionController
def trackback
:
end
end
このアクションのURLを「この記事のトラックバックURL」として、Webに公開します。
この記事のトラックバックURL:
http://mysite.domain/blog/trackback/[記事のID]
沢田さんは、この公開したURLにトラックバックを送ってきます。
「2.リンクを貼る」では、受け取ったトラックバックのパラメータから、各値を抜き取って、HTMLリンクを作成します。この辺のやりかたは、それぞれ好きなやり方でかまいません。ここではとりあえず、trackbackアクションの中でパラメータを保存しておきます。
class BlogController < ActionController
def trackback
Trackback.save(:params)
:
end
end
その後、XMLを作って、沢田さんに「3.結果」を返します。
class BlogController < ActionController
def trackback
if Trackback.save(:params)
@error = 0
elsif
@error = 1
end
render :type => rxml;
end
end
コードは端折ってますが、大枠はこんな感じになると思います。
「沢田さん」は、実在しません。

