Xây dựng API với Laravel

TQH 2022-07-07 10:08:49

Với các bạn làm dự án mà yêu cầu chạy trên môi trường web và app ..., để đồng bộ hóa dữ liệu thì chúng ta sẽ cần xây dựng Api cho dự án của mình, bài viết này mình sẽ hướng dẫn mọi người xây dựng API đúng chuẩn RESTful với framework Laravel version 5.7, vì sử dụng framework Laravel nên mọi người nên tìm hiểu cơ bản về laravel trước khi đọc bài viết.
 

HTTP Request

Để bắt đầu xây dựng API đầu tiền chúng ta sẽ đi tìm hiểu qua về HTTP request, HTTP request có tất cả 9 loại method , 2 loại được sử dụng phổ biến nhất là GET và POST

  1. GET: được sử dụng để lấy thông tin từ sever theo URI đã cung cấp.
  2. HEAD: giống với GET nhưng response trả về không có body, chỉ có header
  3. POST: gửi thông tin tới sever thông qua các biểu mẫu http (đăng kí chả hạn ...)
  4. PUT: ghi đè tất cả thông tin của đối tượng với những gì được gửi lên
  5. PATCH: ghi đè các thông tin được thay đổi của đối tượng.
  6. DELETE: xóa tài nguyên trên server.
  7. CONNECT: thiết lập một kết nối tới server theo URI.
  8. OPTIONS: mô tả các tùy chọn giao tiếp cho resource.
  9. TRACE: thực hiện một bài test loop - back theo đường dẫn đến resource.

Router RESTful

Phía trên mình đã giới thiệu qua về các method của HTTP request, giờ sẽ đi áp dụng vào router của laravel.

Viết Api thì mọi người sẽ khai báo router vào file routes/api.php thay vì sử dụng file routes/web.php.

Mình sẽ giải thích qua về các setting mặc định cho file api.php trong laravel 1 chút

  • Url: những router được khai báo trong file này mặc định có prefix url là api 
  • Middleware: mặc định sẽ được gán Middleware Group là api, tìm trong file app/Http/Kernel sẽ thấy 2 middleware thuộc Middleware Group: api là throttle (giới hạn request / time) và bindings (model binding).

Mọi người có thể tùy chỉnh giá trị mặc định này trong method mapApiRoutes trong file app/Providers/RouteServiceProvider.php

Tiếp theo để thực hiện các thao tác đơn giản như CRUD (Create, Read, Update, Delete) mình sẽ tạo các router

// Lấy danh sách sản phẩm Route::get('products', 'Api\ProductController@index')->name('products.index'); // Lấy thông tin sản phẩm theo id Route::get('products/{id}', 'Api\ProductController@show')->name('products.show'); // Thêm sản phẩm mới Route::post('products', 'Api\ProductController@store')->name('products.store'); // Cập nhật thông tin sản phẩm theo id # Sử dụng put nếu cập nhật toàn bộ các trường Route::put('products/{id}', 'Api\ProductController@update')->name('products.update'); # Sử dụng patch nếu cập nhật 1 vài trường Route::patch('products/{id}', 'Api\ProductController@update')->name('products.update'); // Xóa sản phẩm theo id Route::delete('products/{id}', 'Api\ProductController@destroy')->name('products.destroy');

Mặc định router đã được gán middleware bindings, nếu muốn sử dụng model binding trong controller thì chúng ta sửa lại tham số trong router như sau:

Route::get('products/{product}', 'Api\ProductController@show')->name('products.show'); Route::put('products/{product}', 'Api\ProductController@update')->name('products.update'); Route::patch('products/{product}', 'Api\ProductController@update')->name('products.update'); Route::delete('products/{product}', 'Api\ProductController@destroy')->name('products.destroy');

Ngoài ra trong laravel cũng hỗ trợ chúng ta 1 cách khai báo ngắn gọn hơn

Route::apiResource('products', 'Api\ProductController');

Nếu không muốn sử dụng toàn bộ method trong apiResource mọi người có thể chỉ định sử dụng 1 vài method bằng hàm only

Route::apiResource('products', 'Api\ProductController')->only(['index', 'show']);

Hoặc nếu muốn loại bỏ đi 1 số method không dùng thì có thể sử dụng hàm except


Route::apiResource('products', 'Api\ProductController')->except(['show', 'update']);

Resource Controllers

Tương ứng với các Router RESTful ở phía trên, đặc biệt nếu mọi người dùng method apiResource thì laravel cũng hỗ trợ chúng ta các method xử lí tương ứng trong controller

Để tạo ra Resource Controllers chúng ta chạy lệnh sau


php artisan make:controller Api/ProductController --api


FIle ProductController tạo ra sẽ như sau