PHP RESTful
REST (englisch: Representational State Transfer, abgekürzt REST) bezeichnet eine Reihe architektonischer Einschränkungen und Prinzipien.
Web-APIs, die dem REST-Designstil entsprechen, werden als RESTful-APIs bezeichnet. Sie definieren Ressourcen anhand der folgenden drei Aspekte:
- Intuitive und prägnante Ressourcenadresse: URI, zum Beispiel:
http://example.com/resources/。
- Übertragene Ressource: Die Internet-Medientypen, die der Webdienst akzeptiert und zurückgibt, wie JSON, XML, YAM usw.
- Operationen an der Ressource: Eine Reihe von Request-Methoden, die der Webdienst für diese Ressource unterstützt (z. B. POST, GET, PUT oder DELETE).
In diesem Tutorial verwenden wir PHP (ohne Framework), um einen RESTful-Webdienst zu erstellen. Am Ende des Artikels können Sie den in diesem Kapitel verwendeten Code herunterladen.
In diesem Tutorial lernen Sie Folgendes:
- Erstellen Sie einen RESTful-Webservice.
- Verwenden Sie natives PHP, ohne von einem Framework abhängig zu sein.
- URI-Muster müssen den REST-Regeln folgen.
- Die Formate, die ein RESTful-Service akzeptiert und zurückgibt, können JSON, XML usw. sein.
- Antworten Sie mit entsprechenden HTTP-Statuscodes je nach unterschiedlichen Situationen.
- Demonstrieren Sie die Verwendung von Request-Headern.
- Verwenden Sie einen REST-Client, um den RESTful-Webservice zu testen.
RESTful-Webservice-Beispiel
Der folgende Code ist die RESTful-Service-KlasseSite.php:
Beispiel
<?php
Class Site {
private $sites = array(
1 => 'TaoBao',
2 => 'Google',
3 => 'Example',
4 => 'Baidu',
5 => 'Weibo',
6 => 'Sina'
);
public function getAllSite(){
return $this->sites;
}
public function getSite($id){
$site = array($id => ($this->sites[$id]) ? $this->sites[$id] : $this->sites[1]);
return $site;
}
}
?>
RESTful-Dienste-URI-Zuordnung
Die URI der RESTful-Dienste sollte auf eine intuitive und prägnante Ressourcenadresse gesetzt werden. Der Apache-Server sollte entsprechende Rewrite-Regeln in der .htaccess konfiguriert haben.
In diesem Beispiel verwenden wir zwei URI-Regeln:
1. Die Liste aller Sites abrufen:
http://localhost/restexample/site/list/
2. Verwenden Sie id, um eine bestimmte Site abzurufen. Die folgende URI ruft die Site mit der id 3 ab:
http://localhost/restexample/site/list/3/
Die Konfigurationsregeln der .htaccess-Datei des Projekts lauten wie folgt:
# 开启 rewrite 功能
Options +FollowSymlinks
RewriteEngine on
# 重写规则
RewriteRule ^site/list/$ RestController.php?view=all [nc,qsa]
RewriteRule ^site/list/([0-9]+)/$ RestController.php?view=single&id=$1 [nc,qsa]
RESTful-Web-Service-Controller
In.htaccessIn der Datei erhalten wir die entsprechende Anfrage in der Datei RestController.php, indem wir den Parameter 'view' setzen, und leiten sie an verschiedene Methoden weiter, indem wir verschiedene Parameter von 'view' abrufen.RestController.php Der Code der Datei lautet wie folgt:
Beispiel
<?php
require_once("SiteRestHandler.php");
$view = "";
if(isset($_GET["view"]))
$view = $_GET["view"];
switch($view){
case "all":
$siteRestHandler = new SiteRestHandler();
$siteRestHandler->getAllSites();
break;
case "single":
$siteRestHandler = new SiteRestHandler();
$siteRestHandler->getSite($_GET["id"]);
break;
case "" :
break;
}
?>
Einfache RESTful-Basisklasse
Das Folgende stellt eine Basisklasse für RESTful bereit, die verwendet wird, um HTTP-Statuscodes für die Beantwortung von Anfragen zu verarbeiten,SimpleRest.phpDer Dateicode lautet wie folgt:
Beispiel
<?php
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(
100 => 'Weiter',
101 => 'Protokollwechsel',
200 => 'OK',
201 => 'Erstellt',
202 => 'Akzeptiert',
203 => 'Nicht autoritative Informationen',
204 => 'Kein Inhalt',
205 => 'Inhalt zurücksetzen',
206 => 'Teilweiser Inhalt',
300 => 'Mehrere Auswahlmöglichkeiten',
301 => 'Dauerhaft verschoben',
302 => 'Gefunden',
303 => 'Siehe Andere',
304 => 'Nicht geändert',
305 => 'Proxy verwenden',
306 => '(Nicht verwendet)',
307 => 'Temporäre Weiterleitung',
400 => 'Ungültige Anfrage',
401 => 'Nicht autorisiert',
402 => 'Zahlung erforderlich',
403 => 'Verboten',
404 => 'Nicht gefunden',
405 => 'Methode nicht erlaubt',
406 => 'Nicht akzeptabel',
407 => 'Proxy-Authentifizierung erforderlich',
408 => 'Zeitüberschreitung der Anfrage',
409 => 'Konflikt',
410 => 'Nicht mehr verfügbar',
411 => 'Länge erforderlich',
412 => 'Vorbedingung fehlgeschlagen',
413 => 'Anfrage-Entität zu groß',
414 => 'Request-URI zu lang',
415 => 'Nicht unterstützter Medientyp',
416 => 'Angeforderter Bereich nicht erfüllbar',
417 => 'Erwartung fehlgeschlagen',
500 => 'Interner Serverfehler',
501 => 'Nicht implementiert',
502 => 'Fehlerhaftes Gateway',
503 => 'Dienst nicht verfügbar',
504 => 'Gateway-Zeitüberschreitung',
505 => 'HTTP-Version nicht unterstützt');
return ($httpStatus[$statusCode]) ? $httpStatus[$statusCode] : $status[500];
}
}
?>
RESTful-Web-Service-Handler-Klasse
Das Folgende ist eine RESTful-Web-Service-Handler-Klasse SiteRestHandler.php, die von der RESTful-Basisklasse erbt, die wir oben bereitgestellt haben. Die Klasse entscheidet anhand der Anfrageparameter über den zurückgegebenen HTTP-Statuscode und das Datenformat. Im Beispiel stellen wir drei Datenformate bereit: "application/json", "application/xml" oder "text/html":
SiteRestHandler.phpDer Dateicode lautet wie folgt:
Beispiel
<?php
require_once("SimpleRest.php");
require_once("Site.php");
class SiteRestHandler extends SimpleRest {
function getAllSites() {
$site = new Site();
$rawData = $site->getAllSite();
if(empty($rawData)) {
$statusCode = 404;
$rawData = array('error' => 'Keine Websites gefunden!');
} 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) {
$xml = new SimpleXMLElement('<?xml version="1.0"?><site></site>');
foreach($responseData as $key=>$value) {
$xml->addChild($key, $value);
}
return $xml->asXML();
}
public function getSite($id) {
$site = new Site();
$rawData = $site->getSite($id);
if(empty($rawData)) {
$statusCode = 404;
$rawData = array('error' => 'Keine Websites gefunden!');
} 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;
}
}
}
?>
Als Nächstes greifen wir über http://localhost/restexample/site/list/ zu, und das Ausgabeergebnis ist wie folgt:
RESTful-Webservice-Client
Als Nächstes können wir den "Advance Rest Client" des Google Chrome-Browsers als RESTful-Webservice-Client verwenden, um unseren Dienst anzufragen.
Im Beispiel wird die Adresse http://localhost/restexample/site/list/ angefragt, und die empfangenen Daten sind ähnlich wie:Accept: application/json
Fordern Sie die Site Example mit der ID 3 an, die Zugriffsadresse ist http://localhost/restexample/site/list/3/,

Quellcode-Download
Der im Beispiel verwendete Code kann durch Klicken auf die folgende Schaltfläche heruntergeladen werden:
Quellcode-Download
Andere Erweiterungen