開発室ブログ

Chrome chrome extension Codeigniter framework JSON Laravel Linux PHP Postman Restlet RFC test tools Web API

みんな大好きCodeigniterでREST風APIの実装

 秋の日は釣瓶落としとはよく言ったもので、夕暮れが早くなり朝晩もすっかり涼しくなりまして確実に季節が変わろうとしています。

 そんな折、この度の北海道胆振東部地震により被災された皆様方には心よりお見舞い申し上げますとともに、犠牲になられた方々とご遺族の皆様に深くお悔やみを申し上げます。

 わたしの住んでいる地域では幸いガス・水道は問題なく、煮炊きは出来たのでなんとか食繋ぐ事が出来ましたが、 電力については22時間に渡り停電しており、カーショップで貰ったLEDランタンで闇を照らし、社長から誕生日プレゼントで頂いたモバイルバッテリーをスマホに繋ぎネットやワンセグ放送を見聞きして過ごしていました。

 地震発生から半日以上が経過し、辺り一帯が再び闇に包まれる中、ふっと夜空を見上げると無数のが広がっていました。 札幌市内でこんな星空は見たことなく、満天の星空を見てると色々と考えさせられました。

はじめに

 物思いにふけるのはコレくらいにして、開発室では以前からある指針を掲げています。

担当者の機能分担と作業範囲を明確にするため、フロントエンドとバックエンドは極力独立するように心がけましょう。 フロントエンドは最新動向と将来性を鑑み柔軟に対応しましょう。バックエンドはAPI化して機能の共通化及び部品化を推進し、工数の削減を図りましょう。

 はい、ごもっともです。部品化したAPIをLEGO®のように組み合わせることにより、新たなソリューションを見出すことが出来ればメシうまですね。

The Amazing Life-size LEGO Technic Bugatti Chiron that DRIVES!

 このような潮流のなか、各種ツールの機能追加やサービスの拡充に伴い、いくつかのコア機能のAPI化を検討することにしました。

CodeigniterによるAPIの実装

試作調査

 新規案件であればAPIサーバのフレームワークとしてLaravel推なのでしょうが、現在サービス運用中のフレームワークはCodeigniterを採用しています。 従いましてこのフレームワークをベースにREST LikeなAPIの実装を検討すべくライブラリを漁っていたら、まんま

codeigniter3でREST API

がヒットして記載内容を参考にしながら必要なライブラリーをインストールして自環境に適用してみました。

Class ‘Restserver\Libraries\REST_Controller’ not found

動きません…。原因を探るべくGoogle先生に聞いてみたところ、

Error After Upgrade - Commits on Jun 2, 2018 #930

まぁ~参考サイトが2年前のもので最新バージョンとの動作差分ということにしておきます。

 あと、レスポンスのminetypeはJSONなのですが試験等でレスポンス結果が目視で確認出来れば楽なのでUnicodeのエスケープを抑止しておきます。

Unicodeエスケープを抑止

 とりあえず確認用のControlerを実装して動作確認してみます。

develop/application/controllers/api/v1/Sample.php

<?php
require APPPATH . 'libraries/REST_Controller.php';
use Restserver\Libraries\REST_Controller;
class Sample extends REST_Controller {

    function __construct()
    {
        // Construct the parent class
        parent::__construct();
    }
    /**
     * GETメソッド
     */
    public function index_get($id)
    {
        $this->response([ 'request' => 'get', 'id'=> $id, 'params'=> $this->get() ]);
    }
    /**
     * POSTメソッド
     */
    public function index_post()
    {
        $this->response([ 'request' => 'post', 'params'=> $this->post() ], 201);
    }
    /**
     * PUTメソッド
     */
    public function index_put($id)
    {
        $this->response([ 'request' => 'put', 'id'=> $id, 'params'=> $this->put() ], 201);
    }
    /**
     * DELETEメソッド
     */
    public function index_delete($id)
    {
        $this->response([ 'request' => 'delete', 'id'=> $id ]);
    }
}

結果検証

 結果は以下の通りです(注:本環境ではURLからindex.phpを除去する設定をしています)

# GET送信 index_get()が実行される
$ curl http://fugafuga.com/api/v1/sample/123?key=hogehoge
$ {"request":"get","id":"123","params":{"key":"hogehoge"}

# POST送信 index_post()が実行される
$ curl http://fugafuga.com/api/v1/sample -X POST -d '{"key":"hogehoge"}' -H 'Content-Type:application/json'
$ {"request":"post","params":{"key":"hogehoge"}

# PUT送信 index_put()が実行される
$ curl http://fugafuga.com/api/v1/sample/123 -X PUT -d '{"key":"hagehage"}' -H 'Content-Type:application/json'
${"request":"put","id":"123","params":{"key":"hagehage"}}

# DELETE送信 index_delete()が実行される
$ curl http://fugafuga.com/api/v1/sample/123 -X DELETE
$ {"request":"delete","id":"123"}

 POSTだけidが無いのは一般的にデータ登録後は新規に自動採番されるためです。また、POSTPUTのステータスコードは201 Createdを送っています。 興味のある方はこちらをご覧ください。

毎度おなじみRFCでございます「RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content」

確認ツール

 ターミナルでcurlコマンドを叩くのもいいのですが、RESTサービスの確認にはやはり使い勝手のいいツールがあれば何かと便利です。よく耳にするのがPostmanですが、 わたしはChromeブラウザの拡張機能として提供されているこちらを利用させて頂きました。

Restlet Client - REST API Testing

 リクエストヘッダやBasic認証の設定も簡単でJSON形式のパラメータもリクエスト送出が可能で、ブラウザで操作できるところが気に入ってます。ユーザ登録をするだけで無料で利用できますので気になる方は一度お試しあれ。

本家サイト

おわりに

 本格的なAPI実装の前にCodeigniterにおいてミドルウェア(各メソッドの処理をする前に行う共通的な前処理(認証処理等)例えばLaravelExpressのミドルウェア等)のような機能についても調査しようと思います。

RecentPost