プログラミング

【CodeIgniter4】Web APIを作成する方法

hebishima.shogo

はい、hebiです。
CodeIgniter4でWebAPIを作成したいと思います。

フロントからはjQueryのajaxを利用して実行します。ajaxについては以下の記事を参考にどうぞう!

あわせて読みたい
ページ全体を再読み込みすることなくAjaxでデータを取得する方法
ページ全体を再読み込みすることなくAjaxでデータを取得する方法
スポンサーリンク

Web APIの作成

コントローラの作成

フロントからリクエストを受け付けるためのコントローラを作成しましょう。
ユーザー情報を取得するためのUserクラスとget_userメソッドを作成します。

<?php

namespace App\Controllers;
class User extends BaseController
{
    public function get_user($user_id)
    {
        // user_idをもとにデータを取得する処理を書く

        return $this->response->setStatusCode(200)->setJSON(['name' => 'hebi']);
    }
}

HTTP Status 200(成功)を返却し、jsonでnameを返却するコントローラを作成しました。

ルーティングの設定

app/Config/Routes.php ファイルで、GETリクエストを作成したUserコントローラのget_userにマッピングします。

これによりフロントからget_userを実行できるようになります。

<?php

use CodeIgniter\Router\RouteCollection;

/**
 * @var RouteCollection $routes
 */
$routes->get('/', 'Home::index');

// ユーザ取得
$routes->get('user/(:num)', 'User::get_user/$1');

ユーザを取得するためにidを受け取るようにしているので、(:num)、$1を指定しています。

ポイント1

引数が不要な場合は以下のように定義しましょう。
$routes->get(‘user’, ‘User::get_user’);

ポイント2

POSTの場合は以下のように定義します。
$routes->post(‘user’, ‘User::add_user’);

以上でサーバ側の実装完了です。

フロントからAPIを実行

作成したWebAPIをフロントから実行してみましょう。

ルーティングで設定したuserをurlに指定してGETメソッドでajaxを実行します。引数にはを123を指定してます。

    function getUser(e) {
        $.ajax({
            url: 'index.php/user/123',
            type: 'GET',
            dataType: 'json',
            success: function(response) {
                appendAlert(response.name,'success')
            },
            error: function(xhr, status, error) {
                if (xhr.status === 0) {
                    appendAlert('ネットワークエラーです。','warning')
                } else if (xhr.status === 404) {
                    appendAlert('存在しません。','warning')
                }else{
                    appendAlert('その他サーバーエラーです。','danger')
                }
            }
        });
    }

では実際に動かしてみましょう!

user_idに123が入り、get_userが正常に呼び出されました!
また、フロント側でhebiを受け取ることができました!

JavaScript内のappendAlert関数はBootstrapのアラート機能です。簡単にアラートを表示できるのと成功、警告、エラーのように色分けで表示できる便利機能なので試してみてください!

以上でフロント側の実装完了です。


いや、ちょまっっ!!index.php/user/123のindex.phpはいらないんだけど!!と思いましたよね??

なぜかCodeIgniterの場合はindex.phpを付けないと404エラーになってしまいます。
index.phpをurlに含めなくするには設定が必要なのでやっていきましょう。

index.phpを含めない方法

$indexPathを”に設定

「app\Config\App.php」の$indexPageを’’にします。

// public string $indexPage = 'index.php';
public string $indexPage = '';

Apacheの設定ファイルを開く

以下のコマンドでApacheの設定ファイルを開きます。

sudo nano /etc/httpd/conf/httpd.conf

OSによってパスが変わるので注意してください。本記事のOSはAmazon Linux 2023です。

Apacheの設定ファイル変更

以下のように変更します。

#<Directory "/var/www/html/my_codeigniter_project/public">
#    AllowOverride none
    # Allow open access:
#    Require all granted
#</Directory>

<Directory "/var/www/html/my_codeigniter_project">
    AllowOverride All
    Require all granted
</Directory>

AllowOverride Allを設定することで、.htaccessファイルが有効になり、Apacheの設定ファイルに直接ルーティングを追加することなく、リライトルールを使用してURLのリライトが可能になります。つまり、AllowOverride Allを使用すると、.htaccessファイル内のルーティング設定が有効になり、URLにindex.phpを含めずにCodeIgniterのコントローラやメソッドを直接指定できるようになります。

Apache再起動

Apacheを再起動します。

sudo systemctl restart  httpd

index.phpなしで再実行

urlにindex.phpなしで指定してajaxを実行します。

    function getUser(e) {
        $.ajax({
            url: '/user/123',
            type: 'GET',
            dataType: 'json',
            success: function(response) {
                appendAlert(response.name,'success')
            },
            error: function(xhr, status, error) {
                if (xhr.status === 0) {
                    appendAlert('ネットワークエラーです。','warning')
                } else if (xhr.status === 404) {
                    appendAlert('存在しません。','warning')
                }else{
                    appendAlert('その他サーバーエラーです。','danger')
                }
            }
        });
    }

ちゃんとget_userが呼ばれることを確認できました!

index.phpなしで再実行

urlにindex.phpなしで指定してajaxを実行します。

    function getUser(e) {
        $.ajax({
            url: '/user/123',
            type: 'GET',
            dataType: 'json',
            success: function(response) {
                appendAlert(response.name,'success')
            },
            error: function(xhr, status, error) {
                if (xhr.status === 0) {
                    appendAlert('ネットワークエラーです。','warning')
                } else if (xhr.status === 404) {
                    appendAlert('存在しません。','warning')
                }else{
                    appendAlert('その他サーバーエラーです。','danger')
                }
            }
        });
    }

ちゃんとget_userが呼ばれることを確認できました!

POSTリクエスト用のAPIを作成

POSTリクエストを利用したAPIも作成してみましょう。

コントローラにPOSTのAPIを追加

Userクラスにadd_user関数を追加します。

<?php

namespace App\Controllers;
class User extends BaseController
{
    public function get_user($user_id)
    {
        // user_idをもとにデータを取得する処理を書く

        return $this->response->setStatusCode(200)->setJSON(['name' => 'hebi']);
    }

    public function add_user()
    {
        // POSTデータを取得
        $postData = $this->request->getPost();

        return $this->response->setStatusCode(200)->setJSON(['status' => 'success']);
    }    
}
ポイント

$this->request->getPost()でデータを取得します。

ルーティングの設定

app/Config/Routes.php ファイルに、POSTリクエストをUserコントローラのadd_userにマッピングします。これによりフロントからadd_userをPOSTで実行できるようになります。

<?php

use CodeIgniter\Router\RouteCollection;

/**
 * @var RouteCollection $routes
 */
$routes->get('/', 'Home::index');

// ユーザ取得
$routes->get('user/(:num)', 'User::get_user/$1');

// ユーザ追加
$routes->post('user/', 'User::add_user');

フロントからAPIを実行

ルーティングで指定したuserをurlに指定してPOSTでajaxを実行します。dataにはusername:hebihebiを渡してます。

    function addUser(e) {
        $.ajax({
            url: '/user',
            type: 'POST',
            dataType: 'json',
            data:{
                username:'hebihebi'
            },
            success: function(response) {
                appendAlert('成功','success')
            },
            error: function(xhr, status, error) {
                if (xhr.status === 0) {
                    appendAlert('ネットワークエラーです。','warning')
                } else if (xhr.status === 404) {
                    appendAlert('存在しません。','warning')
                }else{
                    appendAlert('その他サーバーエラーです。','danger')
                }
            }
        });
    }

では実際に動かしてみましょう!

add_userが正常に呼び出され、データも取得できました!

最後に

GETメソッド、POSTメソッドを利用したWeb APIを作成し実行することができたでしょうか?
Web APIをどんどん作成していきましょう!!

最後までお読みいただきありがとうございました(^^)/

スポンサーリンク
ABOUT ME
hebi
hebi
エンジニア
フルスタックエンジニアとして活躍中。
HTML5プロフェッショナル認定Level1、Level2所持者です。

未経験の方でも簡単にプログラミングを学べるようにと情報を発信しております。
記事URLをコピーしました