Portfolio
My Blog
Scroll down to discover
Search
Categories

Tạo dịch vụ API trong PHP

November 4, 2015Category : Code/Web

Tạo dịch vụ API trong PHP, PHP API rest

Bạn đang làm việc với nhiều thiết bị như iPhone, Android và Web rồi đi xem một bài giải thích bạn làm thế nào để phát triển một API RESTful trong PHP. Chuyển giao trạng thái biểu hiện (REST) là một hệ thống Phần mềm để phân phối dữ liệu cho các loại ứng dụng khác nhau. Một hệ thống web service với mã phản hồi ở định dạng JSONhay XML.

Database

Mẫu cơ sở dữ liệu table users với các cột user_id, user_fullname, user_email,user_password và user_status.

CREATE TABLE IF NOT EXISTS `users` 
( 
`user_id` int(11) NOT NULL AUTO_INCREMENT, 
`user_fullname` varchar(25) NOT NULL, 
`user_email` varchar(50) NOT NULL, 
`user_password` varchar(50) NOT NULL, 
`user_status` tinyint(1) NOT NULL DEFAULT '0', 
PRIMARY KEY (`user_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

 

Rest.inc.php

<?php
	class REST {
		
		public $_allow = array();
		public $_content_type = "application/json";
		public $_request = array();
		
		private $_method = "";
		private $_code = 200;
		
		public function __construct(){
			$this->inputs();
		}
		
		public function get_referer(){
			return $_SERVER['HTTP_REFERER'];
		}
		
		public function response($data,$status){
			$this->_code = ($status)?$status:200;
			$this->set_headers();
			echo $data;
			exit;
		}
		
		private function get_status_message(){
			$status = array(
						100 => 'Continue',  
						101 => 'Switching Protocols',  
						200 => 'OK',
						201 => 'Created',  
						202 => 'Accepted',  
						203 => 'Non-Authoritative Information',  
						204 => 'No Content',  
						205 => 'Reset Content',  
						206 => 'Partial Content',  
						300 => 'Multiple Choices',  
						301 => 'Moved Permanently',  
						302 => 'Found',  
						303 => 'See Other',  
						304 => 'Not Modified',  
						305 => 'Use Proxy',  
						306 => '(Unused)',  
						307 => 'Temporary Redirect',  
						400 => 'Bad Request',  
						401 => 'Unauthorized',  
						402 => 'Payment Required',  
						403 => 'Forbidden',  
						404 => 'Not Found',  
						405 => 'Method Not Allowed',  
						406 => 'Not Acceptable',  
						407 => 'Proxy Authentication Required',  
						408 => 'Request Timeout',  
						409 => 'Conflict',  
						410 => 'Gone',  
						411 => 'Length Required',  
						412 => 'Precondition Failed',  
						413 => 'Request Entity Too Large',  
						414 => 'Request-URI Too Long',  
						415 => 'Unsupported Media Type',  
						416 => 'Requested Range Not Satisfiable',  
						417 => 'Expectation Failed',  
						500 => 'Internal Server Error',  
						501 => 'Not Implemented',  
						502 => 'Bad Gateway',  
						503 => 'Service Unavailable',  
						504 => 'Gateway Timeout',  
						505 => 'HTTP Version Not Supported');
			return ($status[$this->_code])?$status[$this->_code]:$status[500];
		}
		
		public function get_request_method(){
			return $_SERVER['REQUEST_METHOD'];
		}
		
		private function inputs(){
			switch($this->get_request_method()){
				case "POST":
					$this->_request = $this->cleanInputs($_POST);
					break;
				case "GET":
				case "DELETE":
					$this->_request = $this->cleanInputs($_GET);
					break;
				case "PUT":
					parse_str(file_get_contents("php://input"),$this->_request);
					$this->_request = $this->cleanInputs($this->_request);
					break;
				default:
					$this->response('',406);
					break;
			}
		}		
		
		private function cleanInputs($data){
			$clean_input = array();
			if(is_array($data)){
				foreach($data as $k => $v){
					$clean_input[$k] = $this->cleanInputs($v);
				}
			}else{
				if(get_magic_quotes_gpc()){
					$data = trim(stripslashes($data));
				}
				$data = strip_tags($data);
				$clean_input = trim($data);
			}
			return $clean_input;
		}		
		
		private function set_headers(){
			header("HTTP/1.1 ".$this->_code." ".$this->get_status_message());
			header("Content-Type:".$this->_content_type);
		}
	}	
?>

 

Rest API Class: api.php
Chứa mã PHP đơn giản, ở đây bạn phải sửa đổi các chi tiết cấu hình cơ sở dữ liệu nhưtên cơ sở dữ liệu, tên người dùng và mật khẩu.

<?php
	require_once("Rest.inc.php");
	class API extends REST {
		public $data = "";
		const DB_SERVER = "localhost";
		const DB_USER = "root";
		const DB_PASSWORD = "";
		const DB = "";
		private $db = NULL;
		public function __construct(){
			parent::__construct();
			$this->dbConnect();
		}
		/*
		 *  Database connection 
		*/
		private function dbConnect(){
			$this->db = mysql_connect(self::DB_SERVER,self::DB_USER,self::DB_PASSWORD);
			if($this->db)
				mysql_select_db(self::DB,$this->db);
		}
		/*
		 * Public method for access api.
		 * This method dynmically call the method based on the query string
		 *
		 */
		public function processApi(){
			$func =	'';
			if(isset($_REQUEST['rquest'])){
				$func = strtolower(trim(str_replace("/","",$_REQUEST['rquest'])));
			}
			if((int)method_exists($this,$func) > 0)
				$this->$func();
			else
				$this->response('',404);// If the method not exist with in this class, response would be "Page not found".
		}
		/* 
		 *	gettime API
		 *  gettime cant GET method
		 */
		private function getTime(){
			// If success everythig is good send header as "OK" and user details
			$result	=	array('timeServer',date('Y-m-d H:i:s',time()));
			$this->response($this->json($result), 200);
			//$this->response('', 204);	// If no records "No Content" status
			//If invalid inputs "Bad Request" status message and reason
			//$error = array('status' => "Failed", "msg" => "Invalid Email address or Password");
			//$this->response($this->json($error), 400);
		}
		/*
		 *	Encode array into JSON
		*/
		
		
		
		private function login() 
		{ 
		.............. 
		} 

		private function users() 
		{ 
		.............. 
		} 

		private function deleteUser() 
		{ 
		............. 
		} 
		
		
		
		private function json($data){
			if(is_array($data)){
				return json_encode($data);
			}
		}
	}
	// Initiiate Library
	$api = new API;
	$api->processApi();
?>

 

Login POST

Hiển thị hồ sơ các người dùng của table users ở địa chỉ http://localhost/rest/login/

Tình trạng đăng nhập Restful API này làm việc với các mã trạng thái: 200 đăng nhập thành công,204 hiển thị lỗi. Để biết thêm thông tin mã trạng thái hãy xem file Rest.inc.php trong file đính kèm.

private function login() 
{ 
// Cross validation if the request method is POST else it will return "Not Acceptable" status 
if($this->get_request_method() != "POST") 
{ 
$this->response('',406); 
} 

$email = $this->_request['email']; 
$password = $this->_request['pwd']; 

// Input validations 
if(!empty($email) and !empty($password)) 
{ 
if(filter_var($email, FILTER_VALIDATE_EMAIL)){ 
$sql = MySQL_query("SELECT user_id, user_fullname, user_email FROM users WHERE user_email = '$email' AND user_password = '".md5($password)."' LIMIT 1", $this->db); 
if(MySQL_num_rows($sql) > 0){ 
$result = MySQL_fetch_array($sql,MySQL_ASSOC); 

// If success everythig is good send header as "OK" and user details 
$this->response($this->json($result), 200); 
} 
$this->response('', 204); // If no records "No Content" status 
} 
} 

// If invalid inputs "Bad Request" status message and reason 
$error = array('status' => "Failed", "msg" => "Invalid Email address or Password"); 
$this->response($this->json($error), 400); 
}

 

 

 

Users GET

Hiển thị thông tn user từ table users. Rest API URL: http://localhost/rest/users/


private function users() 
{ 
// Cross validation if the request method is GET else it will return "Not Acceptable" status 
if($this->get_request_method() != "GET") 
{ 
$this->response('',406); 
} 
$sql = MySQL_query("SELECT user_id, user_fullname, user_email FROM users WHERE user_status = 1", $this->db); 
if(MySQL_num_rows($sql) > 0) 
{ 
$result = array(); 
while($rlt = MySQL_fetch_array($sql,MySQL_ASSOC)) 
{ 
$result[] = $rlt; 
} 
// If success everythig is good send header as "OK" and return list of users in JSON format 
$this->response($this->json($result), 200); 
} 
$this->response('',204); // If no records "No Content" status 
}

 

.htaccess code

Rewriting mã cho URL thân thiện. Trong đoạn mã tải về bạn chỉ cần sửa đổihtaccess.txt thành .htaccess

<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-s 
RewriteRule ^(.*)$ api.php?rquest=$1 [QSA,NC,L] 

RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^(.*)$ api.php [QSA,NC,L] 

RewriteCond %{REQUEST_FILENAME} -s 
RewriteRule ^(.*)$ api.php [QSA,NC,L] 
</IfModule>

 

 

 

01.
© Oliver / All rights reserved.
To top