Bài 4: Xây dựng RESTful API trong CodeIgniter 4

Hướng dẫn API CodeIgniter4

Hướng dẫn xây dựng RESTful API bảo mật với JWT, Rate Limiting và Versioning trong CodeIgniter 4. Trong bài viết này, chúng ta sẽ cùng tìm hiểu cách xây dựng API CodeIgniter 4 chuẩn RESTful từ A–Z. Bạn sẽ học cách tạo RESTful Controller để xử lý JSON request/response, bảo mật API bằng JWT, giới hạn số lượng request (rate limiting) và quản lý versioning cho nhiều phiên bản API. Với hướng dẫn chi tiết và ví dụ minh họa, bạn có thể nhanh chóng triển khai API CodeIgniter4 chuyên nghiệp, dễ mở rộng và an toàn cho các dự án thực tế, đáp ứng tốt cả nhu cầu phát triển ứng dụng web lẫn mobile.


1. RESTful Controller (ResourceController)

CodeIgniter 4 hỗ trợ ResourceController, giúp tạo nhanh các route và method chuẩn REST.

Tạo Controller:

php spark make:controller Api/User --restful

Sẽ tạo app/Controllers/Api/User.php:

namespace App\Controllers\Api;

use CodeIgniter\RESTful\ResourceController;

class User extends ResourceController
{
    protected $modelName = 'App\Models\UserModel';
    protected $format    = 'json';

    public function index()
    {
        return $this->respond($this->model->findAll());
    }

    public function show($id = null)
    {
        $data = $this->model->find($id);
        if (!$data) return $this->failNotFound('User not found');
        return $this->respond($data);
    }

    public function create()
    {
        $data = $this->request->getJSON(true);
        if ($this->model->insert($data)) {
            return $this->respondCreated(['message' => 'User created']);
        }
        return $this->failValidationErrors($this->model->errors());
    }

    public function update($id = null)
    {
        $data = $this->request->getJSON(true);
        if ($this->model->update($id, $data)) {
            return $this->respond(['message' => 'User updated']);
        }
        return $this->failValidationErrors($this->model->errors());
    }

    public function delete($id = null)
    {
        if ($this->model->delete($id)) {
            return $this->respondDeleted(['message' => 'User deleted']);
        }
        return $this->failNotFound('User not found');
    }
}

Đăng ký Route:

app/Config/Routes.php

$routes->resource('api/user'); // Tự động tạo các route chuẩn RESTful

Test:

GET     /api/user
GET     /api/user/1
POST    /api/user
PUT     /api/user/1
DELETE  /api/user/1


2. Xử lý JSON Request/Response

  • Lấy dữ liệu JSON từ request:

    $data = $this->request->getJSON(true);
  • Trả về JSON:

    return $this->respond(['status' => 'success', 'data' => $data]);

3. Authentication API (JWT)

Dùng JWT (JSON Web Token) để bảo vệ API.

Cài thư viện:

composer require firebase/php-jwt

Tạo Helper JWT:

app/Helpers/jwt_helper.php

use Firebase\JWT\JWT;
use Firebase\JWT\Key;

function create_jwt($user)
{
    $key = getenv('JWT_SECRET');
    $payload = [
        'iss' => 'ci4-api',
        'sub' => $user['id'],
        'email' => $user['email'],
        'iat' => time(),
        'exp' => time() + 3600
    ];
    return JWT::encode($payload, $key, 'HS256');
}

function verify_jwt($token)
{
    $key = getenv('JWT_SECRET');
    return JWT::decode($token, new Key($key, 'HS256'));
}

.env

JWT_SECRET = "your-secret-key"

Tạo Login Controller:

public function login()
{
    $email = $this->request->getVar('email');
    $password = $this->request->getVar('password');

    $user = $this->userModel->where('email', $email)->first();
    if (!$user || !password_verify($password, $user['password'])) {
        return $this->failUnauthorized('Invalid credentials');
    }

    $token = create_jwt($user);
    return $this->respond(['token' => $token]);
}

Bảo vệ Route bằng JWT:

Tạo Filter:

php spark make:filter JwtAuth

app/Filters/JwtAuth.php

public function before(RequestInterface $request, $arguments = null)
{
    $authHeader = $request->getHeaderLine('Authorization');
    if (!$authHeader) return Services::response()->setJSON(['error' => 'Token required'])->setStatusCode(401);

    $token = explode(' ', $authHeader)[1];
    try {
        verify_jwt($token);
    } catch (\Exception $e) {
        return Services::response()->setJSON(['error' => 'Invalid token'])->setStatusCode(401);
    }
}

app/Config/Filters.php

'jwt' => \App\Filters\JwtAuth::class,

app/Config/Routes.php

$routes->group('api', ['filter' => 'jwt'], function($routes) {
    $routes->resource('user');
});

👉 Chỉ user có JWT hợp lệ mới truy cập API /api/user.


4. Rate Limiting & Throttling

Cài package:

composer require codeigniter4/shield

Hoặc tự viết filter:

if (cache()->get('ip_'.$ip) > 60) {
    return Services::response()->setJSON(['error' => 'Too many requests'])->setStatusCode(429);
}
cache()->increment('ip_'.$ip, 1, 60); // 60 requests per minute


5. Versioning API

Quản lý version bằng prefix:

$routes->group('api/v1', function($routes) {
    $routes->resource('user');
});
$routes->group('api/v2', function($routes) {
    $routes->resource('user');
});

Qua hướng dẫn trên, bạn đã nắm được toàn bộ quy trình xây dựng API CodeIgniter4 chuẩn RESTful: từ việc tạo ResourceController, xử lý JSON, bảo vệ API bằng JWT cho đến thiết lập rate limiting và quản lý versioning. Đây là nền tảng quan trọng giúp bạn phát triển ứng dụng web hoặc mobile có khả năng mở rộng, dễ bảo trì và đảm bảo an toàn dữ liệu.

➔ Xem thêm: Hướng dẫn cài đặt CodeIgniter 4 cơ bản

🔗 Tham khảo tài liệu chính thức: CodeIgniter 4 User Guide 

Thành Nguyễn

Tôi là Thành, nên tôi đặt tên blog là Thành Nè, Thánh Né... là một coder cùi bắp (Code quèn). Chẳng giỏi viết lách, chỉ giỏi chém gió và có sở thích chia sẻ những kiến thức tôi đã từng...