PHP REST
Willemers Informatik-Ecke

Diese Seite ist noch eine Baustelle. Die Programme sind ungetestet. Ich weiß auch noch nicht, wann ich sie einmal fertigstellen kann.

Mit PHP lässt sich ein REST-Server erstellen. Ein REST-Server verwendet HTTP, um eine Daten-Ressource zur Verfügung zu stellen. Der Client greift bestimmt über die URL, welchen Datenbestandteil er bearbeiten will.

HTTP und das REST-Interface

Methoden

Die Client-Anfragen kodieren ihre gewünschten Aktivitäten nach den Methoden des HTTP-Protokolls (GET, POST, DELETE, UPDATE, ...). Der Wert von $_SERVER['REQUEST_METHOD'] liefert die Methode als 'GET', 'POST' usw.. Die Argumente der Methode werden durch Zugriff aus assoziative Datenstrukturen ausgelesen, die den Schlüssel in rechteckigen Klammern verwenden. So kann $_GET['name'] verwendet werden, wenn auf der Wert des Namens aus der Anfrage gelesen werden soll. Analog läuft der Zugriff bei _POST und den anderen Methoden.

Als Beispiel kann ein REST-Gerüst verwendet werden, wie es unter FIT4PHP.net: PHP-Tutorial - REST-Schnittstellen ausführlicher beschrieben ist und dort als Dateiserver verwendet wird.

<?php
$methode = $_SERVER['REQUEST_METHOD'];
$req = explode('/', trim($_SERVER['PATH_INFO'],'/'));
$argument = isset($req[0]) && !empty($req[0]) ?
                                       $req[0] : NULL;
$daten = file_get_contents('php://input');

echo ("<h1>Hallo</h1>");
switch ($methode) {
  case 'GET':
    if ($argument == NULL)
    {
      echo ('Argument ist leer.<p>');
    } else
        echo ('Übergebenes Argument: '.$argument); 
    break;
  case 'POST':
    echo ('Übergebene POST-Argumente: '.$argument. $daten); 
    break;
  case 'PUT':
    echo ('Übergebene POST-Argumente: '.$argument. $daten); 
    break;
  case 'DELETE':
    echo ('Übergebenes Argument: '.$argument); 
    break;
}
?>

Datenformate

Das Datenformat kann unter andem als XML oder JSON festgelegt werden. Dazu verwendet der Client den HTTP-Eintrag ACCEPT. Der Server antwortet mit dem HTTP-Eintrag CONTENT-TYPE.

Der Inhalt von ACCEPT und CONTENT-TYPE legt das Format fest.

Status-Meldungen

HTTP verwendet dreistellige Statusmeldungen.

Datenbankverbindung

Viele Provider bieten PHP und die Datenbank MySQL auf dem Host als kostenlose Beigabe an. Darum ist es sinnvoll, den PHP-Zugriff auf MySQL näher zu betrachten.

In der Datenbank fewo wird ein Benutzer fewouser angelegt, dem die Datenbank gehört.

Mit der folgenden Klasse Database wird die Verbindung zur Datenbank hergestellt.

<?php 
class Database {
    private $host = "127.0.0.1";
    private $dbname = "fewo";
    private $username = "user";
    private $password = "geheim";

    public $conn;

    public function getConnection(){
        $this->conn = null;
        try{
            $this->conn = new PDO(
                "mysql:host=" . $this->host . ";dbname=" . $this->dbname,
                $this->username, $this->password);
            $this->conn->exec("set names utf8");
        }catch(PDOException $exception){
            echo "Database could not be connected: " . $exception->getMessage();
        }
        return $this->conn;
    }
}  
?>

Datenbanktabelle

Die Daten in der Tabelle Wohnung können in einer PHP-Klasse verwaltet werden. Dazu werden die Spalten in Attributen abgebildet. Die Methoden getWohnung, createWohnung, getSingleWohnung, updateWohnung und deleteWohnung führen dann die Aktionen auf der Tabelle aus.
<?php
    class Wohnung {

        private $conn; // DB-Verbindung
        private $db_table = "Wohnung ";

        public $id;
        public $name;
        public $miete;

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

        public function getWohnung (){
            $sqlQuery = "SELECT id, name, miete FROM " . $this->db_table . "";
            $stmt = $this->conn->prepare($sqlQuery);
            $stmt->execute();
            return $stmt;
        }

        public function createWohnung (){
            $sqlQuery = "INSERT INTO
                        ". $this->db_table ."
                    SET
                        name = :name, 
                        miete = :miete; 
        
            $stmt = $this->conn->prepare($sqlQuery);
        
            $this->name=htmlspecialchars(strip_tags($this->name));
            $this->miete=htmlspecialchars(strip_tags($this->miete));
        
            $stmt->bindParam(":name", $this->name);
            $stmt->bindParam(":miete", $this->miete);
        
            if($stmt->execute()){
               return true;
            }
            return false;
        }

        public function getSingleWohnung (){
            $sqlQuery = "SELECT
                        id, 
                        name, 
                        miete 
                      FROM
                        ". $this->db_table ."
                    WHERE 
                       id = ?
                    LIMIT 0,1";

            $stmt = $this->conn->prepare($sqlQuery);
            $stmt->bindParam(1, $this->id);
            $stmt->execute();

            $dataRow = $stmt->fetch(PDO::FETCH_ASSOC);
            $this->name = $dataRow['name'];
            $this->miete = $dataRow['miete'];
        }        

        public function updateWohnung (){
            $sqlQuery = "UPDATE ". $this->db_table .
                    " SET
                        name = :name, 
                        miete = :miete 
                    WHERE 
                        id = :id";
        
            $stmt = $this->conn->prepare($sqlQuery);
        
            $this->name=htmlspecialchars(strip_tags($this->name));
            $this->miete=htmlspecialchars(strip_tags($this->miete));
            $this->id=htmlspecialchars(strip_tags($this->id));
        
            // bind data
            $stmt->bindParam(":name", $this->name);
            $stmt->bindParam(":miete", $this->miete);
            $stmt->bindParam(":id", $this->id);
        
            if($stmt->execute()){
               return true;
            }
            return false;
        }

        // DELETE
        function deleteWohnung (){
            $sqlQuery = "DELETE FROM " . $this->db_table . " WHERE id = ?";
            $stmt = $this->conn->prepare($sqlQuery);
        
            $this->id=htmlspecialchars(strip_tags($this->id));
            $stmt->bindParam(1, $this->id);
            if($stmt->execute()){
                return true;
            }
            return false;
        }

    }
?>

Auslesen der Wohnungen

Hier werden nun alle Wohnungen aus der Datenbank ausgelesen und in einem Array abgelegt.
<?php
    header("Access-Control-Allow-Origin: *");
    header("Content-Type: application/json; charset=UTF-8");
    
    include_once 'database.php';
    include_once 'wohnung.php';

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

    $items = new Wohnung($conn);

    $stmt = $items->getWohnung();
    $anzzeilen = $stmt->rowCount();
    echo json_encode($anzzeilen);

    if($anzzeilen > 0){
        $wohnungen = array();
        $wohnungen["body"] = array();
        $wohnungen["anzzeilen"] = $anzzeilen;

        while ($zeile = $stmt->fetch(PDO::FETCH_ASSOC)){
            extract($zeile);
            $e = array(
                "id" => $id,
                "name" => $name,
                "email" => $email,
                "age" => $age,
                "designation" => $designation,
                "created" => $created
            );

            array_push($wohnungen["body"], $e);
        }
        echo json_encode($wohnungen);
    }

    else{
        http_response_code(404);
        echo json_encode(
            array("message" => "No record found.")
        );
    }
?>

Links

Quellen: