سرویس وب RESTful در PHP – آموزش ساخت وب سرویس با PHP

Representational State Transfer یا (REST) یکی از سبک های طراحی ساختار و معماری در برنامه نویسی است. سرویس های وبی که از اصول RESTful تبعیت می کنند سرویس های RESTful هستند. در سرویس های RESTful ، از URI ها برای دسترسی به منابع استفاده می شود. در سرویس RESTful ، داده ها و توابع را منابع می نامند. بنابراین در نهایت داده ها و توابع چیزی هستند که ما از طریق سرویس به آن دسترسی خواهیم داشت. در این آموزش ساخت وب سرویس با PHP ، به شما نشان خواهیم داد که چگونه می توانید یک سرویس وب RESTful را ایجاد کنید. برای این کار هیچ چارچوبی بجز کدهای ساده PHP  مورد استفاده قرار نمی گیرد. اکثر اوقات، ترجیح می دهم که کد هایی معمولی و بدون وابستگی به چارچوب را بنویسم ، این رویکرد مزایای خود را دارد. در اینترنت، من آموزشهایی از سرویس های وب را دیده ام که اکثر اوقات، آنها دارای خطا هستند و یا ناقص پیاده سازی شده اند. من این سرویس های RESTful را با استفاده از یک REST client آزمایش کرده ام که اکثرا با شکست و عدم موفقیت مواجه شده اند.

 اهداف این مثال آموزش ساخت وب سرویس با PHP :

• بتوانید یک سرویس وب RESTful بسازید.
• بتوانید از PHP ساده و بدون وابستگی و نیازبه چارچوبی دیگراستفاده کنید.
• الگوهای URI باید از اصول REST پیروی کنند.
• سرویس RESTful باید قادر به پاسخگویی به نیاز برای فرمت هایی مانند JSON، XML باشد.
• بر اساس سناریوهای مختلف ، باید بتوانید استفاده از کد HTTP Status را نشان دهید.
• کاربرد Request headers را نشان دهید.
• سرویس وب RESTful را با استفاده از یک REST client بررسی کنید.

مثالی از سرویس وب RESTful:

در زیر یک دسته دامنه آمده است که برای نشان دادن سرویس RESTful مورد استفاده قرار می گیرد.

<?php
/* 
A domain Class to demonstrate RESTful web services
*/
Class Mobile {
	
	private $mobiles = array(
		۱ => 'Apple iPhone 6S',  
		۲ => 'Samsung Galaxy S6',  
		۳ => 'Apple iPhone 6S Plus',  			
		۴ => 'LG G4',  			
		۵ => 'Samsung Galaxy S6 edge',  
		۶ => 'OnePlus 2');
		
	/*
		you should hookup the DAO here
	*/
	public function getAllMobile(){
		return $this->mobiles;
	}
	
	public function getMobile($id){
		
		$mobile = array($id => ($this->mobiles[$id]) ? $this->mobiles[$id] : $this->mobiles[1]);
		return $mobile;
	}	
}
?>

مپ کردن URI در سرویس هایRESTful :

سرویس های وب RESTful باید URI هایی یکسان و مرتب داشته باشند. فایل HTACCESS برای مپ کردن URL بین فایل درخواست و فایل واقعی استفاده می شود. در این  آموزش ساخت وب سرویس با PHP ، ما از دو URI استفاده می کنیم. برای دریافت فهرستی از تمامی موبایل ها ،وارد این سایت شوید.

http://localhost/restexample/mobile/list/

برای دریافت جزئیات خاصی از یک موبایل ، از شناسه آن استفاده کنید. در ذیل ‘۲’ شناسه یک موبایل است.

http://localhost/restexample/mobile/list/2/

در ادامه ، فایل htaccess نشان داده شده است که درخواست URL را طراحی می کند و آن را به یک فایل PHP ارسال می نماید.

# Turn rewrite engine on
Options +FollowSymlinks
RewriteEngine on

# map neat URL to internal URL
RewriteRule ^mobile/list/$   RestController.php?view=all [nc,qsa]
RewriteRule ^mobile/list/([0-9]+)/$   RestController.php?view=single

کنترل کننده سرویس وب RESTful :

در فایل .htaccess، به منظورشناسایی نمودن درخواست ، از واژه کلیدی ‘view’ استفاده کرده و تمامی درخواست ها را به فایل RestController.php ارسال می کنیم. در زیر، RestController.php نام فایلی است که درخواست ارسال به روش های مربوطه را برای رسیدگی به آن دریافت می کند. واژه کلیدی ‘view’ برای شناسایی درخواست URL استفاده می گردد.

<?php
require_once("MobileRestHandler.php");
		
$view = "";
if(isset($_GET["view"]))
	$view = $_GET["view"];
/*
controls the RESTful services
URL mapping
*/
switch($view){

	case "all":
		// to handle REST Url /mobile/list/
		$mobileRestHandler = new MobileRestHandler();
		$mobileRestHandler->getAllMobiles();
		break;
		
	case "single":
		// to handle REST Url /mobile/show/<id>/
		$mobileRestHandler = new MobileRestHandler();
		$mobileRestHandler->getMobile($_GET["id"]);
		break;

	case "" :
		//۴۰۴ - not found;
		break;
}
?>

یک کلاس پایه برای یک RESTful ساده:

در ذیل،کلاسی نشان داده شده که دارای دو روشی است که معمولا برای تمام هندلرهای سرویسREStful مورد استفاده قرار گیرد. یک روش برای ساخت پاسخ و روش دیگر برای نگهداری از کد وضعیت مختلف HTTP و پیام های مربوط به آن استفاده می شود. چنین متدهای مرسوم و ساده ای می تواند به این کلاس  اضافه شود و این کلاس را پایه و مبنایی برای همه گروه های هندلر RESTful تبدیل کند.

<?php 
/*
A simple RESTful webservices base class
Use this as a template and build upon it
*/
class SimpleRest {
	
	private $httpVersion = "HTTP/1.1";

	public function setHttpHeaders($contentType, $statusCode){
		
		$statusMessage = $this -> getHttpStatusMessage($statusCode);
		
		header($this->httpVersion. " ". $statusCode ." ". $statusMessage);		
		header("Content-Type:". $contentType);
	}
	
	public function getHttpStatusMessage($statusCode){
		$httpStatus = array(
			۱۰۰ => 'Continue',  
			۱۰۱ => 'Switching Protocols',  
			۲۰۰ => 'OK',
			۲۰۱ => 'Created',  
			۲۰۲ => 'Accepted',  
			۲۰۳ => 'Non-Authoritative Information',  
			۲۰۴ => 'No Content',  
			۲۰۵ => 'Reset Content',  
			۲۰۶ => 'Partial Content',  
			۳۰۰ => 'Multiple Choices',  
			۳۰۱ => 'Moved Permanently',  
			۳۰۲ => 'Found',  
			۳۰۳ => 'See Other',  
			۳۰۴ => 'Not Modified',  
			۳۰۵ => 'Use Proxy',  
			۳۰۶ => '(Unused)',  
			۳۰۷ => 'Temporary Redirect',  
			۴۰۰ => 'Bad Request',  
			۴۰۱ => 'Unauthorized',  
			۴۰۲ => 'Payment Required',  
			۴۰۳ => 'Forbidden',  
			۴۰۴ => 'Not Found',  
			۴۰۵ => 'Method Not Allowed',  
			۴۰۶ => 'Not Acceptable',  
			۴۰۷ => 'Proxy Authentication Required',  
			۴۰۸ => 'Request Timeout',  
			۴۰۹ => 'Conflict',  
			۴۱۰ => 'Gone',  
			۴۱۱ => 'Length Required',  
			۴۱۲ => 'Precondition Failed',  
			۴۱۳ => 'Request Entity Too Large',  
			۴۱۴ => 'Request-URI Too Long',  
			۴۱۵ => 'Unsupported Media Type',  
			۴۱۶ => 'Requested Range Not Satisfiable',  
			۴۱۷ => 'Expectation Failed',  
			۵۰۰ => 'Internal Server Error',  
			۵۰۱ => 'Not Implemented',  
			۵۰۲ => 'Bad Gateway',  
			۵۰۳ => 'Service Unavailable',  
			۵۰۴ => 'Gateway Timeout',  
			۵۰۵ => 'HTTP Version Not Supported');
		return ($httpStatus[$statusCode]) ? $httpStatus[$statusCode] : $status[500];
	}
}
?>

آموزش طراحی سایت مشهد

هندلر وب RESTful :

این کلاسی است که درخواست REST را مدیریت می کند. شما باید دو چیز را با دقت درنظر داشته باشید. اولی آن است که چگونه هندلر REST تصمیم می گیرد که چه نوع فرمتی از درخواست باید ارسال شود. این کار بر اساس پارامتر” Accept ” در Request Header تعیین می شود. هنگامی که درخواست ارسال می شود، پروتکلی که در اینجا نشان داده شده است ، باید پارامتر ” Accept” را تنظیم کرده و آن را ارسال کند. مقادیر می توانند مانند “application / json” یا “application / xml” یا “text / html” باشند. دومین چیزی که باید توجه داشته باشید استفاده از Status codes است. برای موفقیت در کار، کد وضعیت ۲۰۰ باید برای پاسخ تنظیم و ارسال شود. به طور مشابه، کدهای وضعیت مختلفی وجود دارند که باید با توجه به شرایط استفاده شوند.

<?php
require_once("SimpleRest.php");
require_once("Mobile.php");
		
class MobileRestHandler extends SimpleRest {

	function getAllMobiles() {	

		$mobile = new Mobile();
		$rawData = $mobile->getAllMobile();

		if(empty($rawData)) {
			$statusCode = 404;
			$rawData = array('error' => 'No mobiles found!');		
		} else {
			$statusCode = 200;
		}

		$requestContentType = $_SERVER['HTTP_ACCEPT'];
		$this ->setHttpHeaders($requestContentType, $statusCode);
				
		if(strpos($requestContentType,'application/json') !== false){
			$response = $this->encodeJson($rawData);
			echo $response;
		} else if(strpos($requestContentType,'text/html') !== false){
			$response = $this->encodeHtml($rawData);
			echo $response;
		} else if(strpos($requestContentType,'application/xml') !== false){
			$response = $this->encodeXml($rawData);
			echo $response;
		}
	}
	
	public function encodeHtml($responseData) {
	
		$htmlResponse = "<table border='1'>";
		foreach($responseData as $key=>$value) {
    			$htmlResponse .= "<tr><td>". $key. "</td><td>". $value. "</td></tr>";
		}
		$htmlResponse .= "</table>";
		return $htmlResponse;		
	}
	
	public function encodeJson($responseData) {
		$jsonResponse = json_encode($responseData);
		return $jsonResponse;		
	}
	
	public function encodeXml($responseData) {
		// creating object of SimpleXMLElement
		$xml = new SimpleXMLElement('<?xml version="1.0"?><mobile></mobile>');
		foreach($responseData as $key=>$value) {
			$xml->addChild($key, $value);
		}
		return $xml->asXML();
	}
	
	public function getMobile($id) {

		$mobile = new Mobile();
		$rawData = $mobile->getMobile($id);

		if(empty($rawData)) {
			$statusCode = 404;
			$rawData = array('error' => 'No mobiles found!');		
		} else {
			$statusCode = 200;
		}

		$requestContentType = $_SERVER['HTTP_ACCEPT'];
		$this ->setHttpHeaders($requestContentType, $statusCode);
				
		if(strpos($requestContentType,'application/json') !== false){
			$response = $this->encodeJson($rawData);
			echo $response;
		} else if(strpos($requestContentType,'text/html') !== false){
			$response = $this->encodeHtml($rawData);
			echo $response;
		} else if(strpos($requestContentType,'application/xml') !== false){
			$response = $this->encodeXml($rawData);
			echo $response;
		}
	}
}
?>

RESTful Web Service Client:

برای بررسی یک سرویس وب RESTful، باید REST client را به صورت برنامه نویسی نوشته و سرویس را مورداستفاده قرار دهید. راه دیگر این است که از یک REST client استفاده کنید. بسیاری از REST clients ، به صورت مستقل (standalone) در بازار موجود هستند. من معمولا از Google Chrome plugin REST client استفاده می کنم. “Advance Rest Client” یک افزونه (extension) گوگل کروم است که یک REST client خوب محسوب می شود. شما باید افزونه (extension) را اضافه کرده و از آن به صورت زیر استفاده کنید. در ذیل ، اسکرین شات هایی از بررسی سرویس وب RESTful در مثال فوق ارائه شده است.
در انتهای آموزش ساخت وب سرویس با PHP خروجی XML در سرویس وب RESTful به شکل زیر خواهد بود :

آموزش ساخت وب سرویس با php

خروجی JSON در سرویس وب RESTful ( آموزش ساخت وب سرویس با PHP) :

php api آموزش

لینک های مرتبط با آموزش ساخت وب سرویس با PHP

آموزش ساخت سبد خرید در PHP

پیاده سازی CRUD در PHP (قسمت ۱)

طراحی سایت مشهد

ورکشاپ رایگان دوره های تخصصی برنامه نویسی

شما این فرصت را دارید، با تکمیل فرم زیر، قبل از انتخاب دوره آموزشی مناسب خود، در ورکشاپ رایگان دوره های تخصصی برنامه نویسی شرکت کنید
  • این فیلد برای اعتبار سنجی است و باید بدون تغییر باقی بماند .

درباره‌ی محمد آذرنیوا

من محمد آذرنیوا، نویسنده و مدرس دوره های برنامه نویسی ، طراحی وب و تحلیل گر پایگاه داده هستم و قصد دارم در این وبسایت مطالب کاربردی در این زمینه را با شما به اشتراک بگذارم ...

همچنین ببینید

اشتباهات در شروع یادگیری کدنویسی

بزرگترین اشتباهات در شروع یادگیری کدنویسی  

اشتباهات در شروع یادگیری کدنویسی بسیار زیاد می باشند؛ به طوریکه برخی آسیب های جدی …

یک نظر

  1. سلام وقت بخیر
    می خواستم بدونم شما می تونید برای نوشتن api به بنده کمک کنید؟
    email
    r09152179019@gmail.com

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *