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.
Để 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
- GET: được sử dụng để lấy thông tin từ sever theo URI đã cung cấp.
- HEAD: giống với GET nhưng response trả về không có body, chỉ có header
- POST: gửi thông tin tới sever thông qua các biểu mẫu http (đăng kí chả hạn ...)
- PUT: ghi đè tất cả thông tin của đối tượng với những gì được gửi lên
- PATCH: ghi đè các thông tin được thay đổi của đối tượng.
- DELETE: xóa tài nguyên trên server.
- CONNECT: thiết lập một kết nối tới server theo URI.
- OPTIONS: mô tả các tùy chọn giao tiếp cho resource.
- TRACE: thực hiện một bài test loop - back theo đường dẫn đến resource.
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
router
được khai báo trong file này mặc định có prefix url
là api 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']);
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