تعداد بازدید: 8466

ساخت REST API با PHP

API (Application Program Interface) یعنی یک واسط برای استفاده از امکانات نرم افزار. واسط های گرافیکی نرم افزار رو هم می تونیم API نام ببریم ، همچنین سرویس هایی نظیر REST , CURL , SOAP نیز برای استفاده از نرم افزار وجود دارد.

موارد گفته شده می توانند دسترسی یک نرم افزار خارجی را به تمام یا بخشی از نرم افزار ممکن سازند. ما API های زیادی در بستر های مختلفی می تونیم داشته باشیم ، در اینجا ما API ها رو در بستر وب بررسی می کنیم.

RESTfull API

REST (Representational State Transfer) یک معماری ساخت API می باشد که از پروتکل Http استفاده می کند. روال کار آن به صورتی است که یک قالب درخواست (Http Request Structured)  به سمت سرور می فرستد و یک قالب پاسخ (Http Response Structured) به سمت کلاینت ارسال می کند.

زمانی که شما در حال ساخت REST API برای یک نرم افزار هستید می توان گفت که شما سرور هستید و زمانی که دارید از یک REST API استفاده می کنید (مثلا زمان ساخت یک اپلیکیشن) می توان گفت که شما کلاینت هستید.

حال کلاینت میتونه هر وسیله ای که شما ازش برای ارسال درخواست استفاده بکنید نظیر فرم های HTML یا CURL یا نرم افزاهایی نظیر Postman , .IOS Device , Android Device

برای ارتباط داده ای میان دو نرم افزار ما از زبان مشترک استفاده JSON استفاده می کنیم. پس داده ها را در سرور برای پاسخ از فرمت محلی بوسیله تابع به فرمت JSON تبدیل می کنیم (Encode) و همچنین در کلاینت پس از دریافت آن ها را از فرمت JSON به فرمت محلی تبدیل می کنیم (Decode).

Server Objects – Resource

در REST ما با Resource ها سر و کار داریم . یعنی عملیات های CRUD را روی Resource انجام می دهیم. بنا به هر یک از عملیات ها ما Http Method متفاوت همچنین Header های متفاوتی خواهیم داشت.

Rest api dealing with resources

معمولا هر عملگر ها در api دارای یک لینک می باشند . به طور مثال برای ساخت REST به ازای یک Resource مثلا Post به ازای چهار عملیات Create , Read , Update , Delete روی Post در یک وبلاگ لینک های زیر را می سازیم(نام Resource را در لینک مشاهده می کنید)

  • api/posts/all.php
  • api/posts/create.php
  • api/posts/single.php
  • api/posts/update.php
  • api/posts/delete.php

کلاینت می تواند با ارسال درخواست معتبر به سرور به پست ها دسترسی پیدا کند و همچنین پست جدید ایجاد کند و یا یک پست را حذف یا بروزرسانی کند (دریافت داده و ارسال داده).

قالب لینک های بالا به صورت تست می باشند و در نرم افزار هایی که از معماری های نوین MVC , HMVC استفاده می کنند ساختار را بر اساس همان قوانین باید پیاده سازی کرد.

HTTP Request methods

HTTP متدهای مختلفی تعریف کرده تا به سرور بفهماند به ازای هر متد کدام فعل را باید روی Resrource پیاده سازی کند. گاها به request methods ها Http Verb هم می گوییم یعنی افعال Http .

  • GET : The GET method requests a representation of the specified resource. Requests using GET should only retrieve data.
  • HEAD : The HEAD method asks for a response identical to that of a GET request, but without the response body.
  • POST : The POST method is used to submit an entity to the specified resource, often causing a change in state or side effects on the server.
  • PUT : The PUT method replaces all current representations of the target resource with the request payload.
  • DELETE : The DELETE method deletes the specified resource.
  • PATCH : The PATCH method is used to apply partial modifications to a resource.

ما در هدر Response می توانیم تعیین کنیم که این API چه متدی را می تواند قبول کند.

Read Resource – GET

عملیات Read یا خواندن از پایگاه داده به ازای یک متد از مدل که می تواند بخشی از Resources را برگرداند. محتوای کد زیر بنا به نوع نرم افزار می تواند یک متد یا یک فایل باشد.

<?php
//Header
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json");
require_once '../config/Database.php';
require_once '../Models/Post.php';
$posts = Post::all();
echo json_encode($posts);

خروجی کد بالا یک شئ JSON خواهد بود که در سمت کلاینت می تواند استفاده شود. در این api ما تمامی پست های موجود را با استفاده از مدل Post بر می گردانیم.

هدر هایی که ما برای این فعل در سرور استفاده کردیم (Response Http) :

  • Access-Control-Allow-Origin : یعنی از چه نواحی قادر به ارسال درخواست به این api می باشند. شما می توانید لینک خاصی را قرار دهید اما در این قسمت ما تمامی نواحی را قرار دادیم ( * ).
  • Content-Type : نوع فرمت خروجی که این api برای کلاینت ارسال می کند.

نکته : یک api خوب حتما باید تمامی نکات را در نظر بگیرد. به طور مثال اگر پاسخ را در قالب JSON می فرستد باید به header Request توجه کند که آیا این درخواست Accept آن appication/json را قبول می کند یا خیر.

نکته : زمانی که دارید Request ارسال می کنید باید توجه داشت که دو هدر Content-Type و Accept را قرار بدهید . چون برخی api ها این دو هدر را مورد بررسی قرار می دهند.

Create Resource – POST

عملیات افزودن resource یا فعل POST یا عملگر Create مثل یک تابع تعبیه شده برای کلاینت است که باید از کانال REST api به پایگاه داده تزریق گردد. در این نوع باید از سمت کلاینت به سمت سرور داده ارسال گردد و در سمت سرور پس از پردازش از آن ها استفاده کنند.

<?php
//Header
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Method: POST");
header("Access-Control-Allow-Headers: Access-Control-Allow-Origin,Access-Control-Allow-Method,Access-Control-Allow-Headers,Content-Type,Athorization,X-Requested-With");
header("Content-Type: application/json");
require_once '../config/Database.php';
require_once '../Models/Post.php';
$data = json_decode(file_get_contents('php://input'),true);
$id = Post::create($data);
if($id){
    echo json_encode(['id'=>$id,'message'=>'post created successfully']);
}else{
    echo json_encode(['message'=>'post creation was failed!']);
}

دریافت داده ها از کلاینت در سرور بوسیله تابع file_get_contents انجام می پذیرد (خط ۹).

تابع json_decod داده های ارسالی با فرمت JSON را به فرمت محلی تبدیل می کند. پارامتر این تابع :

  • json : پارامتر اول این تابع یک رشته json می باشد.
  • assoc : پارامتر دوم این تابع مشخص می کند که خروجی را به صورت آرایه برگرداند یا شئ.

تابع json_encode داده ها را از فرمت محلی به فرمت JSON تبدیل می کند. پارامتر این تابع :

  • value : مقدار محلی با فرمت های مجاز این تابع نظیر Object , Array , …

توضیح Header ها در این عملگر :

  • Access-Control-Allow-Method : این هدر مشخص می کند که بوسیله چه HTTP Method به این api درخواست بزنیم که در این مثال POST می باشد و در غیر اینصورت سرور خطای 400 یا همان Bad Request می دهد.
  • Access-Control-Allow-Headers : هدر های مجاز قابل استفاده در Response.

Update Resource – PUT

بروزرسانی یک Resource یعنی تغییر اطلاعات کلی Resource که در مثال ما post می باشد. در کد های زیر می توانید ببینید به ازای کل پارامتر ها جایگزینی اتفاق افتاده که باید از فعل PUT استفاده کنیم.

<?php
//Header
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Method: PUT");
header("Access-Control-Allow-Headers: Access-Control-Allow-Origin,Access-Control-Allow-Method,Access-Control-Allow-Headers,Content-Type,Athorization,X-Requested-With");
header("Content-Type: application/json");
require_once '../config/Database.php';
require_once '../Models/Post.php';
$data = json_decode(file_get_contents('php://input'),true);
$post = Post::find($data['id']);
$result = $post->update($data);
if($result){
    echo json_encode(['message'=>'post Updated successfully']);
}else{
    echo json_encode(['message'=>'post Updating was failed!']);
}

در این api هنگام ارسال درخواست از سمت client باید یک row از جنس JSON بفرستیم که در آن id پست مورد نظر باشد به همراه پارامتر های آن .

Delete Resource – DELETE

حذف Resource یا فعل DELETE جهت حذف یک post از داخل پایگاه داده .

<?php
//Header
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Method: DELETE");
header("Access-Control-Allow-Headers: Access-Control-Allow-Origin,Access-Control-Allow-Method,Access-Control-Allow-Headers,Content-Type,Athorization,X-Requested-With");
header("Content-Type: application/json");
require_once '../config/Database.php';
require_once '../Models/Post.php';
$data = json_decode(file_get_contents('php://input'),true);
$post = Post::find($data['id']);
$result = $post->delete();
if($result){
    echo json_encode(['message' => 'post deleted']);
}else{
    echo json_encode(['message' => 'Opration fail']);
}

Authetication in RESTfull API

ممکن است در برخی عملگر های REST مبتنی بر authentication یا احراز هویت باشد. برای authenticate کردن کاربر از یک token استفاده می کنیم که دلیل بر authenticate می باشد. این token می تواند ترکیب encode شده ای از username , password کاربر باشد و یا توسط سیستم یا کتابخانه مورد نظر ساخته شده باشد. این کار با روش های مختلف قابل پیاده سازی می باشد:

  • ارسال token با استفاده از Request Header با نام Authentication
  • ارسال token به عنوان uri parameter

بسته به ساختار نرم افزار SERVER شما می توان از روش های مختلفی استفاده کرد. ساده ترین روش ارسال Token به Header با نام Authentication می باشد که باید در این روش نوع الگوریتم استفاده شده برای ارسال Authentication Header تعیین گردد.

<?php
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json");
header("WWW-Authenticate: Basic realm=\"Authorization Required\"");

if (@$_SERVER['PHP_AUTH_USER'] !== "admin" || @$_SERVER['PHP_AUTH_PW'] !== "admin") {
    header("HTTP\ 1.1 401 Unauthorized");
    echo json_encode(
        [
            'message' => 'Not Authorize',
            'username' => $_SERVER['PHP_AUTH_PW'],
            'password' => $_SERVER['PHP_AUTH_PW'],
        ]
    );
} else {
    echo json_encode(
        [
            'message' => 'Authorize',
            'username' => $_SERVER['PHP_AUTH_PW'],
            'password' => $_SERVER['PHP_AUTH_PW'],
        ]
    );
}

با استفاده از WWW-Authenticate نوع الگوریتم برای authentication را تعیین کردیم . در سمت کلاینت هم با استفاده از هدر Authorization مقادیر username , password را با استفاده از همین الگوریتم Basic با base64 به شکل encode در آوردیم و فرستادیم:

Authorization: Basic YWRtaW46YWRtaW4=

این روش از امنیت پایینی برخوردار است. توصیه می شود برای پیاده سازی سیستم Authentication در نرم افزار خود از کتابخانه های امن تر استفاده کنید.

 

مطالب مشابه

هدر های Http در درخواست و پاسخ

Http Headers (قسمت اول)

هر گاه اطلاعاتی را از سرور نیاز داشته باشیم باید یک درخواست به آن بزنیم و پاسخ را از سمت سرور دریافت کنیم. بر این...

php command line feature

امکانات command line در php

php یک زبان برای embed (جاسازی) به فرمت HTML می باشد. در عین حال command line interface نیز دارد و می توان مثل تمامی...

composer یک ابزار رابط خط فرمان (command line interface) برای مدیریت و نصب پروژه های PHP می باشد. بوسیله آن می توان روی پروژه خود پکیج هایی (پروژه ها یا کتابخانه ها) را نصب کنید یا بالعکس پروژه خود را قابل نصب بر روی پروژه های دیگر کنید.

Composer (قسمت اول)

composer یک ابزار رابط خط فرمان (command line interface) برای مدیریت و نصب پروژه های PHP می باشد. بوسیله آن می توان روی...

اشتراک گذاری :

مدیر وب سایت گنوتک . برنامه نویسی رو با زبان C در هفده سالگی شروع کردم . در حال حاضر به برنامه نویسی php برپایه معماری MVC , HMVC و همچنین سیستم مدیریت محتوای WordPress و فریم ورک محبوب لاراول علاقه مند هستم و دوست دارم اطلاعاتم رو با شما به اشتراک بگذارم.

2 دیدگاه برای ساخت REST API با PHP

  1. خیلی خیلی جالب بود … ممنون از سایت خوبتون . لطفا اگر تونستید یکم درباره
    Php://input
    هم صحبت کنید

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

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