CakePHP

CakePHPでWEB APIを自作してみる。

2013/06/14

サーバAで運営しているDBのデータを、サーバBで必要になりました。

サーバAのデータをエクスポートしてサーバBへインポートし、作成したプログラムで必要に応じて取得する、という流れでもいいのですが、エクスポート、インポートする手間が惜しい。

ならば、サーバBからのリクエストに対し必要なデータを送信するという、いわゆる API をサーバAに設置してはどうかという流れになり、調べてみましたら、意外と簡単にできることが判明。

忘備録代わりにコチラに作り方をポストしてみます。

通信仕様の決定

バージョンは例によって1.3です。
例として『メールアドレスをキーに顧客データを取得する』といったものを作成してみたいと思います。

APIの中身は、以前使ったことがある amazon の API を真似て作ってみます。

アマゾンAPIにリクエスト方式を見ると、オプションを「?」及び「&」で繋げる GETメソッドで HTTP通信を行なっています。
いわゆる、REST(Representational State Transfer の略)という仕様ですね。

リクエスト方式としてはあと、SOAP(Simple Object Access Protocol)という方式がありますが、こちらは、XMLを使って引数やオプションを指定します。

ということで、今回はアマゾンに倣って REST を使ってみることとします。

送信側PHP

では、まずはGETメソッドをHTTP経由でAPIプログラムに投げる処理から。
単純に書くと、以下の様な手順になります。

  1. 送信するパラメータを準備
  2. パラメータを&で連結
  3. URLを作成
  4. APIで生成されたXMLを、file_get_contents関数で受け取る
  5. 手順4で受信した返り値(XML)を、 simplexml_load_string関数 で、オブジェクトに代入
  6. CakePHPのCakePHPのxmlパーサで、配列に変換する

これを、PHPで書くとこんな感じ。

XMLで返ってきたものを、CakePHPのXMLパーサを利用して、配列に変換しています。
これで foreach でもなんでも使えるようになります。

API側のPHPプログラム

呼ばれる先のPHP。コチラはCakePHPではなく、プレーンなPHPです。
GETで送信されているので、$_GET でパラメータを取得し、欲しい内容作成し XML形式で出力しています。

パラメータには検索するメールアドレスの他、認証用やセキュリティ対策用のオプションを指定して、できるだけ固いシステムにすることが必要かと思われます。

今回のサンプルでは、timestamp と token はGETで受けたものをそのまま返しているだけです。

帰ってくる結果

pr($xml_array);
した結果。

意外と簡単にできることが分かり、色々と画策中。
先にも書きましたが、セキュリティ面を強固にする必要があると思うので、その辺りをまた研究したいと思います。

[tgAmazonItemLookup asin="B005UK3K8O" related="1"]

-CakePHP
-, ,