【初心者用】CakePHPを学んでいこう⑧(APIその2)

前回はCakePHPでTwitterAPIを使用し、ツイートを取得して画面に表示する方法を紹介しました。
今回は実際にCakePHPで、JSONデータを返却するAPI処理をご紹介いたします。

1. 環境

OS:Windows11

XAMPP:8.0.25 (PHP8.0.25)

Composer:2.5.1

CakePHP:4.4

2. WebAPIの種類

前回はWebAPIについてざっくり紹介しましたが、今回はさらにWebAPIの種類について紹介いたします。

WebAPIで主に使用される種類に、RPC(Representational StateTransfer)・SOAP(Simple Object Access Protocol)・REST(Remote Procedure Call)があります。

歴史的にはRPC→SOAP→RESTの流れで登場しました。

2-1. RPC API

プログラムの関数やメソッドを呼び出すといったプログラム上のやり取りと同じように、プログラムから別のネットワーク上にある関数を呼び出す仕組みです。

RPCにも種類があり、XML-RPCやJSON-RPCがあります。

最近では「gRPC API」といったRPCの技術を採用したAPIも登場しています。

2-2. SOAP API

SOAPはリクエスト・レスポンス共にXML形式でやり取りします。

この送受信されるXML形式をSOAPメッセージといい、headerとbodyに分かれています。

厳格なメッセージパターンで安全性は高いですが、複雑な仕様や負荷が高いため敬遠されるようになりました。

2-3. REST API(RESTful API)

特定のURLにHTTPアクセスすることでJSONやXML形式でレスポンスする仕組みです。

SOAPはプロトコルで厳格なルールが求められるのに対し、RESTは設計思想で柔軟性がありシンプルです。

RESTの設計にはいくつかの制約がありますが、今回は代表的な4つのルールを紹介します。

ちなみに、このルールに従ったREST APIを「RESTful API」と呼びます。


(1)統一されたインターフェイス

以下のようなHTTPで定義されている4つのメソッドを使用するというルールがあります。

・GET(データの取得)
・POST(データの登録)
・PUT(データの更新)
・DELETE(データの削除)


(2)アドレス可能性

情報のやりとりの方法や定義を、あらかじめ統一しておくというもので、どこから呼び出しても同じ形式で呼び出せる必要があります。

例えば「https://api.〇〇/user/」のようなURLにアクセスすればリソースにアクセスできる、といったように取得する情報ごとに識別されているということです。


(3)接続性

1つのリンクから複数の別のリンクに接続できるということです。

つまり、XMLやJSONといったハイパーメディアを使用するということです。


(4)ステートレス性

やり取りをセッション情報などに持たせず、やり取りの情報はその時だけで完結させるということです。

図で表すと以下のようになります。


このように、取得したいデータは一つのリクエストで完結させる必要があります。

3. APIを作成してみよう

それでは実際にCakePHPで簡単なAPIを作成してみましょう。

今回は、特定のURLにアクセスすると、JSON型式でデータが返却されるよう実装していきます。

3-1. コントローラー

APIが叩かれたとき、処理を返却するためのコントローラーを作成していきます。

前回使用したApiコントローラーを使用します。

../cake_pjt/src/Controller/ApiController.php


    /**
     * formデータを返却するAPI
     *
     */
    public function form()
    {
        // Fromsモデルを読み込む
        $this->loadModel('Forms');
        // パラメータを受け取る
        $params = $this->request->getQuery();
        $id = null;
        // 特定のパラメータがあればセットしておく
        if (isset($params['id']) && $params['id']) {
            $id = $params['id'];
        }
        // 条件に合わせてデータを取得する
        if ($id !== null) {
            $form_data = $this->Forms->get($id);
        } else {
            $form_data = $this->Forms->find('all');
        }

        // 返却データをセットする
        $this->set([
            'forms' => $form_data,
            '_serialize' => ['forms']
        ]);
    }


今回は以前作成したFormsテーブルのデータを返却するAPIを作成しました。

上から順に説明していきます。

最初に、Formsテーブルの情報を取得したいため「loadModel」でモデルを読み込んでいます。

中間部分では、パラメータがあるかどうかのチェックを行い、データの取得方法を分岐しています。

ここでは、リクエスト側がIDをパラメータとして渡してくればそのIDのデータのみを返却し、何も渡さなければ全件数を取得するようになっています。

最後に、JSONデータを返却しています。「_serialize」と指定するだけで、JSONまたはXMLデータとして返却されます。

3-2. JSONデータが取得できるか確認する

上記で作成したAPIを実行してみましょう。

以下のURLにアクセスします。

http://localhost/cake_pjt/api/form.json


JSONデータが出力されました。

3-3. 別プロジェクトからAPIを実行する

別プロジェクトとありますが、現在使用している「cake_pjt」をコピーし、そこに今回作成したAPIを呼び出す処理を実装して確認してみます。

確認用なのでお好きな名前で大丈夫です。

ここでは「cake_pjt2」という名前でコピーしました。


そのままコピーしたので「cake_pjt2」プロジェクト内にも「ApiController.php」があります。

ここに確認用の処理を書いていきます。

../cake_pjt2/src/Controller/ApiController.php


    /**
     * API取得テスト
     *
     */
    public function apiTest()
    {
        $this->autoRender = false;
        $url = 'http://localhost/cake_pjt/api/form';
        $data = [];
        $option = [
            'headers' => [
                'Accept' => 'application/json'
            ]
        ];
        $http = new Client();
        $response = $http->get($url, $data, $option);
        if ($response->isOk()) {
            $content = $response->getJson();
            debug($content['forms']);
        }
        exit;
    }


最初の「autoRender」はtemplateを使用しないため、falseとしています。

前回ご紹介したAPI取得方法と同じく、Clientクラスを使用します。

まずは全件数のデータを取得します。


全件数取得出来ています!

それでは特定のIDだけを取得してみましょう。

「$data = [];」となっているところを「$data = [‘id’ => ‘2’];」として、ID=2のデータを取得します。


ID指定でも無事取得することができました。

4. まとめ

今回はCakePHPを使用して簡単なAPIを作成してみました。

APIの作成と聞くと難しそうに聞こえますが、CakePHPでAPI作成を手助けする処理があらかじめ用意されているので、APIがどんなものか作ってみたいという方でも簡単に実装することができます。

ちなみに、API実行時のPOST・PUT・DELETEも同様に実装すればAPIを動かすことができます。

ただ、その際はApiのコントローラーのCSRFの保護を無効にする必要があるので注意してください。

参考:https://book.cakephp.org/4/ja/controllers/middleware.html


実装するにあたって、公式ドキュメントはとても参考になります。さらに詳細を知りたい場合は、ぜひ公式ドキュメントを参照してみてください。