REST API în PHP

Există abordări speciale, care standardizează API-ul pentru comoditatea generală atât a dezvoltatorilor API, cât și a utilizatorilor săi.

Una dintre aceste abordări este REST API. La baza sa stă ideea că pentru operațiile CRUD este necesar să se utilizeze diferite metode ale protocolului HTTP.

Pentru obținerea datelor - metoda GET, pentru crearea datelor - metoda POST, pentru modificarea datelor - metoda PUT, pentru ștergerea datelor - metoda DELETE.

De exemplu, să luăm în considerare un API care manipulează utilizatori. Să vedem cum vor arăta URL-urile pentru diferite acțiuni.

Obținem toți utilizatorii:

urlGET http://api.loc/users/

Obținem un utilizator după id-ul său:

urlGET http://api.loc/user/1/

Creăm un utilizator:

urlPOST http://api.loc/user/

Modificăm utilizatorul după id-ul său:

urlPUT http://api.loc/user/1/

Ștergem utilizatorul după id-ul său:

urlDELETE http://api.loc/user/1/

Să vedem cum este implementat REST API în PHP. Aici există o anumită problemă. Cert este că atât PHP, cât și CURL suportă doar metodele GET și POST:

api.loc/index.php<?php
  $method = $_SERVER['REQUEST_METHOD'];
  var_dump($method); // doar GET și POST
?>

Prin urmare, pentru a implementa REST API va trebui să recurgem la un truc. Esența lui constă în faptul că în realitate datele vor fi transmise doar prin metodele GET și POST, dar noi vom simula funcționarea altor metode cu ajutorul unui antet HTTP personalizat. Să-l numim, de exemplu, HTTP-X-HTTP-METHOD.

Atunci vom putea obține conținutul acestui antet în felul următor:

api.loc/index.php<?php
  $method = $_SERVER['HTTP-X-HTTP-METHOD'];
?>

Acum putem scrie implementarea API-ului:

api.loc/index.php<?php
  $method = $_SERVER['HTTP-X-HTTP-METHOD'];
  
  switch ($method)  {
    case 'GET':
      // ...
    break;
    case 'POST':
      // ...
    break;
    case 'PUT':
      // ...
    break;
    case 'DELETE':
      // ...
    break;
  }
?>
Задание 1

Implementați un REST API pentru produsele unui magazin online.

Задание 2

Testați funcționarea API-ului implementat cu ajutorul bibliotecii CURL.