Xây dựng Webservice với RESTful API trong PHP

696
23-04-2018
Xây dựng Webservice với RESTful API trong PHP

RESTful API là một dạng tiêu chuẩn được sử dụng trong việc thiết kế API cho ứng dụng web để giúp quản lý resource một cách dễ dàng nhất. 

Trên trang web, điều này thường được thực hiện thông qua việc sử dụng RESTful URIs. Để xây dựng một Webservice mình sẽ sử dụng ví dụ dưới đây dùng để lấy toàn bộ công thức làm bánh:

recipies.com/api/v1/recipe/cake

API là từ viết tắt của Application Programming Interface

API là từ viết tắt của Application Programming Interface

Với API chúng ta sẽ xây dựng ở đây sẽ bao gồm hai lớp. Một lớp trừu tượng (Abstract class in PHP) sẽ xử lý các phân tích của các URI và trả lại phản hồi, và một lớp con cụ thể sẽ chứa các điểm cuối (endpoints) cho API. Bằng cách này, chúng ta có được một lớp trừu tượng có thể tái sử dụng và có thể trở thành nền tảng của bất kỳ RESTful API khác.

Việc đầu tiên chúng ta sẽ tạo ra 1 file .htaccess với nội dung sau:

Thông tin về RESTful API

Bây giờ chúng ta sẽ tạo 1 Abstract class.

Như đã đề cập trước đó, lớp này sẽ đóng vai trò như là một lớp bao phủ cho tất cả các endpoints tùy chỉnh thứ mà API sẽ sử dụng. Nó sẽ nhận request từ URI, xác định phương thức HTTP (GET, POST, PUT, DELETE) và lắp ráp dữ liệu được cung cấp trong header hoặc trong URI.

Khi đã hoàn thành, lớp trừu tượng sẽ đưa các thông tin yêu cầu vào một phương thức trong lớp cụ thể để thực hiện công việc. Sau đó lớp này sẽ xử lý và trả về HTTP response cho client.

Trước hết chúng ta sẽ khai báo class, properties, và constructor:

abstract class API

{

/**

* Property: method

* The HTTP method this request was made in, either GET, POST, PUT or DELETE

*/

protected $method = '';

/**

* Property: endpoint

* The Model requested in the URI. eg: /files

*/

protected $endpoint = '';

/**

* Property: verb

* An optional additional descriptor about the endpoint, used for things that can

* not be handled by the basic methods. eg: /files/process

*/

protected $verb = '';

/**

* Property: args

* Any additional URI components after the endpoint and verb have been removed, in our

* case, an integer ID for the resource. eg: /<endpoint>/<verb>/<arg0>/<arg1>

* or /<endpoint>/<arg0>

*/

protected $args = Array();

/**

* Property: file

* Stores the input of the PUT request

*/

protected $file = Null;

/**

* Constructor: __construct

* Allow for CORS, assemble and pre-process the data

*/

public function __construct($request) {

header("Access-Control-Allow-Origin: *");

header("Access-Control-Allow-Methods: *");

header("Content-Type: application/json");

$this->args = explode('/', rtrim($request, '/'));

$this->endpoint = array_shift($this->args);

if (array_key_exists(0, $this->args) && !is_numeric($this->args[0])) {

$this->verb = array_shift($this->args);

}

$this->method = $_SERVER['REQUEST_METHOD'];

if ($this->method == 'POST' && array_key_exists('HTTP_X_HTTP_METHOD', $_SERVER)) {

if ($_SERVER['HTTP_X_HTTP_METHOD'] == 'DELETE') {

$this->method = 'DELETE';

} else if ($_SERVER['HTTP_X_HTTP_METHOD'] == 'PUT') {

$this->method = 'PUT';

} else {

throw new Exception("Unexpected Header");

}

}

switch($this->method) {

case 'DELETE':

case 'POST':

$this->request = $this->_cleanInputs($_POST);

break;

case 'GET':

$this->request = $this->_cleanInputs($_GET);

break;

case 'PUT':

$this->request = $this->_cleanInputs($_GET);

$this->file = file_get_contents("php://input");

break;

default:

$this->_response('Invalid Method', 405);

break;

}

}

}

Ở khai báo trên, chúng ta trả về header các thông tin như: Access-Control-Allow-Origin (header chỉ định domain được phép truy cập), Access-Control-Allow-Methods (xác định phương thức được phép truy cập), Content-Type (kiểu dữ liệu, ở đây chúng ta trả về là json).

Xây dựng Webservice với RESTful API trong PHP

Chúng ta quan tâm đến hàm processAPI(). Công việc của nó là để xác định xem phương thức nào của lớp được thực thi khi nhận request từ phía client. Nếu có, nó sẽ gọi hàm được yêu cầu, nếu không sẽ trả về 404 response.Đó là tất cả những gì cho lớp trừu tượng. Bây giờ, chúng ta sẽ làm một lớp Concrete class.

Tìm hiểu xây dựng Webservice với RESTful API trong PHP

Ở trên có 2 lớp APIKey và User mình không nhắc tới trong bài này nhưng nó sẽ được sử dụng cho ứng dụng API với namespace là Models, sẽ thực hiện các chức năng về API key và dữ liệu user.

Đơn giản là vậy, với mỗi endpoint bạn muốn trong API bạn có thể thêm giống như MyAPI class này cho phù hợp yêu cầu.

Để thực hiện các API chúng ta cần phải tạo ra các tập tin PHP mà trong file .htaccess mình đã cấu hình. Trong ví dụ này mình đặt tên nó api.php:

 RESTful API trong PHP

Nếu bạn truy cập vào địa chỉ /api/v1/example (nếu có dữ liệu User và Token cần thiết) bạn sẽ thấy được kết quả.

Các bạn hãy tìm hiểu tiếp nhé. Cảm ơn các bạn đã theo dõi!

Nguồn tham khảo: https://ngoton.it/xay-dung-webservice-voi-restful-api-trong-php

SHARE