Lekcja 15 – Tworzenie i korzystanie z API RESTful w PHP

Tworzenie i korzystanie z API RESTful w PHP – wprowadzenie

API (Application Programming Interface) to interfejs, który umożliwia komunikację między różnymi systemami. API RESTful (Representational State Transfer) to styl architektury, który pozwala na komunikację pomiędzy serwerami i klientami za pomocą standardowych metod HTTP, takich jak GET, POST, PUT i DELETE. W tej lekcji dowiesz się, jak tworzyć proste API RESTful w PHP oraz jak korzystać z zewnętrznych API w swoich aplikacjach.

Zasady API RESTful

RESTful API opiera się na kilku kluczowych zasadach:

  1. Stateless (Bezstanowość): Każde zapytanie do API jest niezależne, co oznacza, że serwer nie przechowuje żadnych informacji o stanie użytkownika pomiędzy różnymi zapytaniami.
  2. Używanie standardowych metod HTTP:
    • GET: Odczytywanie zasobów.
    • POST: Tworzenie nowych zasobów.
    • PUT/PATCH: Aktualizacja istniejących zasobów.
    • DELETE: Usuwanie zasobów.
  3. Zasoby: W API RESTful dane są traktowane jako zasoby, które są identyfikowane za pomocą unikalnych URL-i. Zasobem może być np. użytkownik, produkt, artykuł, itd.
  4. Formatuje dane najczęściej w JSON: Choć API może obsługiwać różne formaty danych, JSON jest najbardziej powszechnym formatem używanym w API RESTful.

Tworzenie API RESTful w PHP

Stworzymy proste API, które zarządza zasobem użytkowników. Nasze API będzie pozwalało na dodawanie użytkowników, pobieranie listy użytkowników, aktualizację danych oraz usuwanie użytkowników.

1. Struktura projektu API

Na początek ustalmy prostą strukturę dla naszego projektu API:

/api
  /users
    index.php
    create.php
    update.php
    delete.php
  /config
    Database.php
  /models
    User.php

W folderze api/users będą znajdować się pliki odpowiadające za różne operacje na użytkownikach (tworzenie, odczytywanie, aktualizowanie, usuwanie).

2. Konfiguracja bazy danych

Najpierw musimy skonfigurować połączenie z bazą danych. Tworzymy plik Database.php, który będzie odpowiadał za połączenie z MySQL.

<?php
class Database {
  private $host = "localhost";
  private $db_name = "moja_baza";
  private $username = "root";
  private $password = "";
  public $conn;

  public function getConnection() {
    $this->conn = null;

    try {
      $this->conn = new PDO("mysql:host=" . $this->host . ";dbname=" . $this->db_name, $this->username, $this->password);
      $this->conn->exec("set names utf8");
    } catch (PDOException $exception) {
      echo "Błąd połączenia: " . $exception->getMessage();
    }

    return $this->conn;
  }
}
?>

3. Tworzenie modelu użytkownika (User.php)

Następnie tworzymy model User.php, który będzie odpowiadał za operacje związane z użytkownikami w bazie danych.

<?php
class User {
  private $conn;
  private $table_name = "users";

  public $id;
  public $name;
  public $email;
  public $created_at;

  public function __construct($db) {
    $this->conn = $db;
  }

  // Funkcja do odczytu użytkowników
  public function read() {
    $query = "SELECT id, name, email, created_at FROM " . $this->table_name . " ORDER BY created_at DESC";

    $stmt = $this->conn->prepare($query);
    $stmt->execute();

    return $stmt;
  }

  // Funkcja do tworzenia użytkownika
  public function create() {
    $query = "INSERT INTO " . $this->table_name . " SET name=:name, email=:email, created_at=:created_at";

    $stmt = $this->conn->prepare($query);

    $this->name = htmlspecialchars(strip_tags($this->name));
    $this->email = htmlspecialchars(strip_tags($this->email));

    $stmt->bindParam(":name", $this->name);
    $stmt->bindParam(":email", $this->email);
    $stmt->bindParam(":created_at", date('Y-m-d H:i:s'));

    if ($stmt->execute()) {
      return true;
    }

    return false;
  }

  // Funkcja do aktualizacji użytkownika
  public function update() {
    $query = "UPDATE " . $this->table_name . " SET name = :name, email = :email WHERE id = :id";

    $stmt = $this->conn->prepare($query);

    $this->name = htmlspecialchars(strip_tags($this->name));
    $this->email = htmlspecialchars(strip_tags($this->email));
    $this->id = htmlspecialchars(strip_tags($this->id));

    $stmt->bindParam(':name', $this->name);
    $stmt->bindParam(':email', $this->email);
    $stmt->bindParam(':id', $this->id);

    if ($stmt->execute()) {
      return true;
    }

    return false;
  }

  // Funkcja do usuwania użytkownika
  public function delete() {
    $query = "DELETE FROM " . $this->table_name . " WHERE id = :id";

    $stmt = $this->conn->prepare($query);

    $this->id = htmlspecialchars(strip_tags($this->id));

    $stmt->bindParam(':id', $this->id);

    if ($stmt->execute()) {
      return true;
    }

    return false;
  }
}
?>

4. Pobieranie listy użytkowników (index.php)

Stworzymy teraz plik index.php, który zwróci listę użytkowników w formacie JSON.

<?php
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");

include_once '../config/Database.php';
include_once '../models/User.php';

$database = new Database();
$db = $database->getConnection();

$user = new User($db);
$stmt = $user->read();
$num = $stmt->rowCount();

if ($num > 0) {
  $users_arr = array();
  $users_arr["users"] = array();

  while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    extract($row);

    $user_item = array(
      "id" => $id,
      "name" => $name,
      "email" => $email,
      "created_at" => $created_at
    );

    array_push($users_arr["users"], $user_item);
  }

  echo json_encode($users_arr);
} else {
  echo json_encode(array("message" => "Nie znaleziono użytkowników."));
}
?>

5. Dodawanie użytkownika (create.php)

Stworzymy teraz plik create.php, który pozwala na dodawanie nowych użytkowników do bazy danych.

<?php
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");
header("Access-Control-Allow-Methods: POST");
header("Access-Control-Allow-Headers: Access-Control-Allow-Headers,Content-Type,Access-Control-Allow-Methods,Authorization,X-Requested-With");

include_once '../config/Database.php';
include_once '../models/User.php';

$database = new Database();
$db = $database->getConnection();

$user = new User($db);

$data = json_decode(file_get_contents("php://input"));

if (!empty($data->name) && !empty($data->email)) {
  $user->name = $data->name;
  $user->email = $data->email;

  if ($user->create()) {
    echo json_encode(array("message" => "Użytkownik został dodany."));
  } else {
    echo json_encode(array("message" => "Nie udało się dodać użytkownika."));
  }
} else {
  echo json_encode(array("message" => "Niekompletne dane."));
}
?>

6. Aktualizowanie użytkownika (update.php)

Plik update.php pozwala na aktualizację danych użytkownika.

<?php
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");
header("Access-Control-Allow-Methods: PUT");
header("Access-Control-Allow-Headers: Access-Control-Allow-Headers,Content-Type,Access-Control-Allow-Methods,Authorization,X-Requested-With");

include_once '../config/Database.php';
include_once '../models/User.php';

$database = new Database();
$db = $database->getConnection();

$user = new User($db);

$data = json_decode(file_get_contents("php://input"));

if (!empty($data->id)) {
  $user->id = $data->id;
  $user->name = $data->name;
  $user->email = $data->email;

  if ($user->update()) {
    echo json_encode(array("message" => "Użytkownik został zaktualizowany."));
  } else {
    echo json_encode(array("message" => "Nie udało się zaktualizować użytkownika."));
  }
} else {
  echo json_encode(array("message" => "Niekompletne dane."));
}
?>

7. Usuwanie użytkownika (delete.php)

Plik delete.php pozwala na usuwanie użytkownika z bazy danych.

<?php
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");
header("Access-Control-Allow-Methods: DELETE");
header("Access-Control-Allow-Headers: Access-Control-Allow-Headers,Content-Type,Access-Control-Allow-Methods,Authorization,X-Requested-With");

include_once '../config/Database.php';
include_once '../models/User.php';

$database = new Database();
$db = $database->getConnection();

$user = new User($db);

$data = json_decode(file_get_contents("php://input"));

if (!empty($data->id)) {
  $user->id = $data->id;

  if ($user->delete()) {
    echo json_encode(array("message" => "Użytkownik został usunięty."));
  } else {
    echo json_encode(array("message" => "Nie udało się usunąć użytkownika."));
  }
} else {
  echo json_encode(array("message" => "Niekompletne dane."));
}
?>

Korzystanie z zewnętrznego API w PHP

W PHP możesz również korzystać z zewnętrznych API za pomocą narzędzi takich jak cURL lub funkcji file_get_contents().

Korzystanie z cURL do wysyłania zapytań GET

Oto przykład, jak pobrać dane z API za pomocą cURL:

<?php
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://jsonplaceholder.typicode.com/users");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);

if (curl_errno($ch)) {
  echo 'Błąd: ' . curl_error($ch);
} else {
  $data = json_decode($response, true);
  print_r($data);
}

curl_close($ch);
?>

Korzyści z API RESTful

  1. Modularność: API pozwala na łatwe oddzielenie warstwy frontendowej od backendu.
  2. Elastyczność: API może być używane przez różne platformy (strony WWW, aplikacje mobilne, itp.).
  3. Standaryzacja: RESTful API używa standardowych metod HTTP i formatów danych takich jak JSON, co ułatwia komunikację między systemami.

Podsumowanie

W tej lekcji nauczyliśmy się, jak tworzyć API RESTful w PHP oraz jak korzystać z zewnętrznych API. Zbudowaliśmy proste API, które pozwala zarządzać użytkownikami (dodawanie, odczytywanie, aktualizowanie i usuwanie) oraz omówiliśmy, jak można wysyłać zapytania do innych API przy użyciu cURL.

Gratulacje! Ukończyłeś lekcję 15.
Przejdź teraz do lekcji 16 >> Obsługa plików JSON i XML w PHP


Spis Treści - darmowy kurs PHP

Wprowadzenie: Instalacja środowiska PHP
Lekcja 1: Podstawy składni PHP
Lekcja 2: Funkcje i instrukcje warunkowe w PHP
Lekcja 3: Pętle w PHP
Lekcja 4: Tablice w PHP
Lekcja 5: Dodatkowe podstawy funkcji w PHP
Lekcja 6: Praca z formularzami HTML w PHP
Lekcja 7: Obsługa plików w PHP
Lekcja 8: Sesje i ciasteczka w PHP
Lekcja 9: Podstawy operacji na bazach danych MySQL z PHP
Lekcja 10: Prepared Statements w PHP i bezpieczeństwo aplikacji
Lekcja 11: Zarządzanie użytkownikami – rejestracja, logowanie i autoryzacja w PHP
Lekcja 12: Wzorce projektowe w PHP – wprowadzenie do wzorca MVC
Lekcja 13: Zaawansowane techniki pracy z bazami danych w PHP
Lekcja 14: Testowanie jednostkowe w PHP z PHPUnit
Lekcja 15: Tworzenie i korzystanie z API RESTful w PHP
Lekcja 16: Obsługa plików JSON i XML w PHP

Dodatki
- Spis najważniejszych funkcji PHP