Gọi API trong PHP

Bạn sẽ cần biết API REST mà bạn đang gọi hỗ trợ GEThoặc POSThoặc cả hai phương thức. Mã dưới đây là thứ phù hợp với tôi, tôi đang gọi API dịch vụ web của riêng mình, vì vậy tôi đã biết API lấy gì và nó sẽ trả về cái gì. Nó hỗ trợ cả hai GETPOSTphương thức, vì vậy thông tin ít nhạy cảm đi vào URL (GET)và thông tin như tên người dùng và mật khẩu được gửi dưới dạng POSTbiến. Ngoài ra, tất cả mọi thứ đi qua HTTPSkết nối.

Bên trong mã API, tôi mã hóa một mảng mà tôi muốn trở về định dạng json, sau đó chỉ cần sử dụng lệnh PHP echo $my_json_variableđể làm cho chuỗi json đó có sẵn cho máy khách.

Vì vậy, như bạn có thể thấy, API của tôi trả về dữ liệu json, nhưng bạn cần biết (hoặc nhìn vào dữ liệu được trả về để tìm hiểu) định dạng phản hồi từ API là gì.

Đây là cách tôi kết nối với API từ phía khách hàng:

$processed = FALSE;
$ERROR_MESSAGE = '';

// ************* Call API:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.myapi.com/api.php?format=json&action=subscribe&email=" . $email_to_subscribe);
curl_setopt($ch, CURLOPT_POST, 1);// set post data to true
curl_setopt($ch, CURLOPT_POSTFIELDS,"username=myname&password=mypass");   // post data
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$json = curl_exec($ch);
curl_close ($ch);

// returned json string will look like this: {"code":1,"data":"OK"}
// "code" may contain an error code and "data" may contain error string instead of "OK"
$obj = json_decode($json);

if ($obj->{'code'} == '1')
{
  $processed = TRUE;
}else{
  $ERROR_MESSAGE = $obj->{'data'};
}

...

if (!$processed && $ERROR_MESSAGE != '') {
    echo $ERROR_MESSAGE;
}

BTW, tôi cũng đã thử sử dụng file_get_contents()phương pháp như một số người dùng ở đây đã đề xuất, nhưng điều đó không hiệu quả với tôi. Tôi tìm ra GET0phương pháp để nhanh hơn và đáng tin cậy hơn.

  • Techblog
  • Development

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

Vinh Phạm

811

23-04-2018

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

Gọi API trong PHP

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:

Gọi API trong PHP

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: ////

* or //

*/

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).

Gọi 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.

Gọi 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:

Gọi 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!

BizFly Cloud là nhà cung cấp dịch vụ điện toán đám mây với chi phí thấp, được vận hành bởi VCCorp.

BizFly Cloud là một trong 4 doanh nghiệp nòng cốt trong "Chiến dịch thúc đẩy chuyển đổi số bằng công nghệ điện toán đám mây Việt Nam" của Bộ TT&TT; đáp ứng đầy đủ toàn bộ tiêu chí, chỉ tiêu kỹ thuật của nền tảng điện toán đám mây phục vụ Chính phủ điện tử/chính quyền điện tử.