Heim >Backend-Entwicklung >PHP-Tutorial >Erstellen Sie eine REST -API von Grund auf neu: eine Einführung
Das aktuelle Internet -Ökosystem wurde durch APIs vollständig verändert, und es gibt guten Grund. Durch die Verwendung von APIs von Drittanbietern in Ihrem Produkt oder Ihrer Dienstleistung können Sie auf eine breite Palette nützlicher Funktionen zugreifen-wie bei Authentifizierungs- oder Speicherdiensten-, die für Sie und Ihre Benutzer von Vorteil sind. Indem Sie Ihre eigene API aufdecken, wird Ihre Bewerbung "Teil der Komposition" und nutzt sie so, dass Sie nie gedacht haben ... natürlich, wenn Sie dies richtig tun. In dieser zweiteiligen Serie zeige ich Ihnen, wie Sie eine erholsame API-Ebene für Ihre PHP-Anwendung mit einer Reihe echter Best Practices erstellen. Der vollständige Quellcode für dieses Projekt wird am Ende von Teil 2 bereitgestellt.
Schlüsselpunkte
Rest: Entwickler-freundlicher UI
Erstens ist die API die Benutzeroberfläche des Entwicklers, daher muss sie freundlich, einfach, einfach zu bedienen und natürlich angenehm sein. Auch wenn es sich nur um eine einfache, aber gut geschriebene Lesendatei handelt, ist die Dokumentation ein guter Anfang. Die geringsten Informationen, die wir benötigen, sind eine Zusammenfassung des Service -Umfangs und eine Liste von Methoden und Zugriffspunkten. Eine gute Zusammenfassung kann sein: & GT; Es verfügt über zwei Objekttypen, Kontakte und Notizen. Jeder Kontakt enthält grundlegende Attribute wie Vorname, Nachname und E -Mail -Adresse. Zusätzlich kann jeder Kontakt mehrere Notizen im Markdown -Format zugeordnet haben.
Dann ist es besser, alle Ressourcen und Vorgänge aufzulisten, die wir implementieren werden. Dies kann als Äquivalent zur Visualisierung des Anwendungsdrahtmodells angesehen werden. Nach den Schlüsselprinzipien der Ruhe wird jede Ressource durch eine URL dargestellt, bei der der Betrieb die HTTP -Methode ist, mit der darauf zugreifen. Zum Beispiel ruft GET/API/CONTACES/12 einen Kontakt mit ID 12 ab, während Put/API/Kontakte/12 denselben Kontakt aktualisieren. Die vollständige Methodenliste lautet wie folgt:
<code>URL HTTP Method Operation /api/contacts GET 返回联系人数组 /api/contacts/:id GET 返回 ID 为 :id 的联系人 /api/contacts POST 添加一个新联系人并返回它(添加了 id 属性) /api/contacts/:id PUT 更新 ID 为 :id 的联系人 /api/contacts/:id PATCH 部分更新 ID 为 :id 的联系人 /api/contacts/:id DELETE 删除 ID 为 :id 的联系人 /api/contacts/:id/star PUT 将 ID 为 :id 的联系人添加到收藏夹 /api/contacts/:id/star DELETE 从收藏夹中删除 ID 为 :id 的联系人 /api/contacts/:id/notes GET 返回 ID 为 :id 的联系人的笔记 /api/contacts/:id/notes/:nid GET 返回 ID 为 :id 的联系人的 ID 为 :nid 的笔记 /api/contacts/:id/notes POST 为 ID 为 :id 的联系人添加新笔记 /api/contacts/:id/notes/:nid PUT 更新 ID 为 :id 的联系人的 ID 为 :nid 的笔记 /api/contacts/:id/notes/:nid PATCH 部分更新 ID 为 :id 的联系人的 ID 为 :nid 的笔记 /api/contacts/:id/notes/:nid DELETE 删除 ID 为 :id 的联系人的 ID 为 :nid 的笔记</code>
Für vollständigere und professionelle Dokumentation können Sie Tools wie Swagger, APIDOC oder Google APIS Discovery -Service verwenden: Ihre Benutzer werden Sie mögen!
Tools und Einstellungen
Das Hauptwerkzeug, mit dem ich die API erstellen werde, ist das schlanke Framework. Warum? & Gt;
Das ist wahr. Durch die leistungsstarken Routing-Funktionen können Sie andere Methoden als Get and Post einfach verwenden. Es bietet integrierte Unterstützung für die HTTP-Methode-Override (über HTTP-Header und versteckte Postfelder) und können mit Middleware und zusätzlichen Funktionen angerufen werden, um Anwendungsprogramme und API zu aktivieren Entwicklung ist wirklich einfach. Zusammen mit SLIM verwende ich IDIORM, um auf die Datenbankschicht und die Protokollierung mit Monolog zugreifen zu können. Daher sieht unsere Datei composer.json so aus:
<code class="language-json">{ "name": "yourname/my-contacts", "description": "Simple RESTful API for contacts management", "license": "MIT", "authors": [ { "name": "Your Name", "email": "you@yourdomain.com" } ], "require": { "slim/slim": "*", "slim/extras": "*", "slim/middleware": "*", "monolog/monolog": "*", "j4mie/paris": "*", "flynsarmy/slim-monolog": "*" }, "archive": { "exclude": ["vendor", ".DS_Store", "*.log"] }, "autoload": { "psr-0": { "API": "lib/" } } }</code>Die Pakete
Slim/Extras und Slim/Middleware bieten nützliche Funktionen wie Auflösung von Inhaltstyp und grundlegende Authentifizierung. Unsere benutzerdefinierte Klasse befindet sich im API -Namespace und im Lib -Verzeichnis. Zu diesem Zeitpunkt lautet unsere Arbeitsverzeichnisstruktur wie folgt:
<code>bootstrap.php composer.json README.md bin/ import install lib/ API/ public/ .htaccess index.php share/ config/ default.php db/ logs/ sql/ data/ contacts.sql users.sql tables/ contacts.sql notes.sql users.sql ssl/ mysitename.crt mysitename.key</code>
Der Front-End-Controller unserer Anwendung ist öffentlich/index.php, und alle Nicht-Datei- oder Verzeichnisverkehr werden hier über Standard-URL-Umschreibregeln umgeleitet. Dann habe ich den gesamten Initialisierungscode in bootstrap.php eingebaut und wir werden später sehen. Das Share -Verzeichnis enthält Daten wie Protokolle, Konfigurationsdateien, SQLite -Datenbanken und Dumpdateien sowie SSL -Zertifikate. Das Bin -Verzeichnis enthält Dienstprogrammskripte, die die bereitgestellte .sql -Datei zum Erstellen einer Datenbank und zum Importieren einiger Daten verwenden.
Unsere API ist nur im HTTPS -Modus zugänglich und erfordert keine Umleitung. Dies vereinfacht die Authentifizierungslogik und verhindert, dass Clients nicht verknüpft auf unverschlüsselte Endpunkte zugreifen. Die einfachste und logischste Möglichkeit, diese Methode einzurichten, besteht darin, direkt auf dem Webserver oder über einen Proxy -Server zu handeln. Ich benutze dazu Old zuverlässiger Apache, und meine virtuelle Host -Datei sieht so aus:
<code class="language-apache"><directory> # Required for mod_rewrite in .htaccess AllowOverride FileInfo Options All -Indexes DirectoryIndex index.php index.shtml index.html <ifmodule php5_module=""> # For Development only! php_flag display_errors On </ifmodule> # Enable gzip compression <ifmodule filter_module=""> AddOutputFilterByType DEFLATE application/json </ifmodule> Order deny,allow Deny from all Allow from 127.0.0.1 </directory> <virtualhost> ServerAdmin you@yourdomain.com DocumentRoot "/path/to/MyApp/public" ServerName myapp.dev <ifmodule rewrite_module=""> RewriteEngine on ## Throw a 403 (forbidden) status for non secure requests RewriteCond %{HTTPS} off RewriteRule ^.*$ - [L,R=403] </ifmodule> </virtualhost> <ifmodule ssl_module=""> NameVirtualHost *:443 Listen 443 SSLRandomSeed startup builtin SSLRandomSeed connect builtin <virtualhost> ServerAdmin you@yourdomain.com DocumentRoot "/path/to/MyApp/public" ServerName myapp.dev SSLEngine on SSLCertificateFile /path/to/MyApp/share/ssl/mysitename.crt SSLCertificateKeyFile /path/to/MyApp/share/ssl/mysitename.key SetEnv SLIM_MODE development </virtualhost> </ifmodule></code>
Definieren Sie zuerst die Verzeichniseinstellungen so, dass sie den HTTP- und HTTPS -Versionen unserer Website gemeinsam sind. In einer Nicht-Secure-Host-Konfiguration verwende ich mod_rewrite, um einen 403-Fehler für jede nicht sichere Verbindung zu geben, und habe dann im Sicherheitsabschnitt SSL mit meinem selbstsignierten Zertifikat sowie die SLIM_ENV-Variable eingerichtet, die aussagt Setzen Sie den aktuellen Anwendungsmodus. Weitere Informationen zum Erstellen eines selbstsignierten Zertifikats auf Apache und zur Installation finden Sie in diesem Artikel auf SSLSHOPPER. Nachdem wir ein klares Ziel, eine grundlegende Verzeichnisstruktur und Servereinstellungen haben, führen wir Composer.phar Installation aus und schreiben Sie einen Code.
Boot-Programm und Front-End-Controller
Wie bereits erwähnt, ist die Datei bootstrap.php für das Laden unserer Anwendungseinstellungen und Autoloadereinstellungen verantwortlich.
<code>URL HTTP Method Operation /api/contacts GET 返回联系人数组 /api/contacts/:id GET 返回 ID 为 :id 的联系人 /api/contacts POST 添加一个新联系人并返回它(添加了 id 属性) /api/contacts/:id PUT 更新 ID 为 :id 的联系人 /api/contacts/:id PATCH 部分更新 ID 为 :id 的联系人 /api/contacts/:id DELETE 删除 ID 为 :id 的联系人 /api/contacts/:id/star PUT 将 ID 为 :id 的联系人添加到收藏夹 /api/contacts/:id/star DELETE 从收藏夹中删除 ID 为 :id 的联系人 /api/contacts/:id/notes GET 返回 ID 为 :id 的联系人的笔记 /api/contacts/:id/notes/:nid GET 返回 ID 为 :id 的联系人的 ID 为 :nid 的笔记 /api/contacts/:id/notes POST 为 ID 为 :id 的联系人添加新笔记 /api/contacts/:id/notes/:nid PUT 更新 ID 为 :id 的联系人的 ID 为 :nid 的笔记 /api/contacts/:id/notes/:nid PATCH 部分更新 ID 为 :id 的联系人的 ID 为 :nid 的笔记 /api/contacts/:id/notes/:nid DELETE 删除 ID 为 :id 的联系人的 ID 为 :nid 的笔记</code>
Erstens bekomme ich die aktuelle Umgebung. Wenn eine Datei namens
<code class="language-json">{ "name": "yourname/my-contacts", "description": "Simple RESTful API for contacts management", "license": "MIT", "authors": [ { "name": "Your Name", "email": "you@yourdomain.com" } ], "require": { "slim/slim": "*", "slim/extras": "*", "slim/middleware": "*", "monolog/monolog": "*", "j4mie/paris": "*", "flynsarmy/slim-monolog": "*" }, "archive": { "exclude": ["vendor", ".DS_Store", "*.log"] }, "autoload": { "psr-0": { "API": "lib/" } } }</code>
Konfigurieren Sie einen Monolog-Protokoll, der in die Datei von App/Path/Share/Logs/Envname_yyyy-mm-dd.log schreibt. Nach einigen Verbesserungen (Sie können sie im Quellcode sehen) erhalte ich den generierten Protokollautor und versuche eine Verbindung zur Datenbank herzustellen:
<code>bootstrap.php composer.json README.md bin/ import install lib/ API/ public/ .htaccess index.php share/ config/ default.php db/ logs/ sql/ data/ contacts.sql users.sql tables/ contacts.sql notes.sql users.sql ssl/ mysitename.crt mysitename.key</code>
Schließlich habe ich meiner Anwendungsinstanz die erforderliche Middleware hinzugefügt. Slims Middleware ist wie eine Zwiebelebene. Die erste Middleware, die Sie hinzufügen, ist die innerste Ebene, sodass die Reihenfolge unserer Middleware wichtig ist. Ich verwende die folgende Middleware in unserer API: - Cache (innere Ebene); Body "Best Practice Utility Middleware; - Authentifizierung (äußerste Schicht). Wir werden all dies schreiben, mit Ausnahme der bereits bestehenden ContentTypes. Am Ende der Bootstrap -Datei definiere ich zwei globale Variablen $ App (AP) und $ log (Logwriter). Die Datei wird von unserem Front-End-Controller index.php geladen, und in dieser Datei passiert etwas Magie.
Routing -Struktur
Slim hat eine schöne Funktion namens Routengruppen. Mit dieser Funktion können wir unsere Anwendungswege wie folgt definieren:
<code class="language-apache"><directory> # Required for mod_rewrite in .htaccess AllowOverride FileInfo Options All -Indexes DirectoryIndex index.php index.shtml index.html <ifmodule php5_module=""> # For Development only! php_flag display_errors On </ifmodule> # Enable gzip compression <ifmodule filter_module=""> AddOutputFilterByType DEFLATE application/json </ifmodule> Order deny,allow Deny from all Allow from 127.0.0.1 </directory> <virtualhost> ServerAdmin you@yourdomain.com DocumentRoot "/path/to/MyApp/public" ServerName myapp.dev <ifmodule rewrite_module=""> RewriteEngine on ## Throw a 403 (forbidden) status for non secure requests RewriteCond %{HTTPS} off RewriteRule ^.*$ - [L,R=403] </ifmodule> </virtualhost> <ifmodule ssl_module=""> NameVirtualHost *:443 Listen 443 SSLRandomSeed startup builtin SSLRandomSeed connect builtin <virtualhost> ServerAdmin you@yourdomain.com DocumentRoot "/path/to/MyApp/public" ServerName myapp.dev SSLEngine on SSLCertificateFile /path/to/MyApp/share/ssl/mysitename.crt SSLCertificateKeyFile /path/to/MyApp/share/ssl/mysitename.key SetEnv SLIM_MODE development </virtualhost> </ifmodule></code>
Ich habe zwei verschachtelte Gruppen /API und /v1 erstellt, damit wir die Best Practice "Versionsregelung in der URL" leicht einhalten können. Ich habe auch einige optionale Routen für/API/API erstellt, die benutzerlesbare Inhalte enthalten können, sowie eine gemeinsame Root-URL (/) URL, die in der realen Welt die öffentliche Benutzeroberfläche der Anwendung enthalten kann.
Mein erster Ansatz war es, Routing Middleware (ein weiteres Slim Middleware) innerhalb der Gruppe /V1 für Authentifizierung und JSON -Anforderung /-Anantwort zu verwenden. Ich fand es jedoch praktischer und prägnanter, klassische Middleware zu verwenden. Wie bereits erwähnt, ist Middleware eine Instanz einer Klasse, die von Slimmiddleware geerbt wurde. In der Call () -Methode der Slim Middleware erfolgt der Vorgang.
<code class="language-php">// Init application mode if (empty($_ENV['SLIM_MODE'])) { $_ENV['SLIM_MODE'] = (getenv('SLIM_MODE')) ? getenv('SLIM_MODE') : 'development'; } // Init and load configuration $config = array(); $configFile = dirname(__FILE__) . '/share/config/' . $_ENV['SLIM_MODE'] . '.php'; if (is_readable($configFile)) { require_once $configFile; } else { require_once dirname(__FILE__) . '/share/config/default.php'; } // Create Application $app = new API\Application($config['app']);</code>
Unser JSON Middleware implementiert zwei Best Practices: "JSON -Reaktion" und "JSON Coding Body". Die Methode lautet wie folgt:
<code>URL HTTP Method Operation /api/contacts GET 返回联系人数组 /api/contacts/:id GET 返回 ID 为 :id 的联系人 /api/contacts POST 添加一个新联系人并返回它(添加了 id 属性) /api/contacts/:id PUT 更新 ID 为 :id 的联系人 /api/contacts/:id PATCH 部分更新 ID 为 :id 的联系人 /api/contacts/:id DELETE 删除 ID 为 :id 的联系人 /api/contacts/:id/star PUT 将 ID 为 :id 的联系人添加到收藏夹 /api/contacts/:id/star DELETE 从收藏夹中删除 ID 为 :id 的联系人 /api/contacts/:id/notes GET 返回 ID 为 :id 的联系人的笔记 /api/contacts/:id/notes/:nid GET 返回 ID 为 :id 的联系人的 ID 为 :nid 的笔记 /api/contacts/:id/notes POST 为 ID 为 :id 的联系人添加新笔记 /api/contacts/:id/notes/:nid PUT 更新 ID 为 :id 的联系人的 ID 为 :nid 的笔记 /api/contacts/:id/notes/:nid PATCH 部分更新 ID 为 :id 的联系人的 ID 为 :nid 的笔记 /api/contacts/:id/notes/:nid DELETE 删除 ID 为 :id 的联系人的 ID 为 :nid 的笔记</code>
Wir können den Stammpfad an den Middleware Constructor übergeben. In diesem Fall bestehe ich /api /v1, so dass unsere Middleware nur auf den API -Teil unserer Website angewendet wird. Wenn der aktuelle Pfad mit dem Header des Antwortinhaltstyps übereinstimmt, ist der Header des Antwortinhaltstyps gezwungen, Anwendung/JSON zu sein, und ich überprüfe die Anforderungsmethode. Wenn die Anforderungsmethode eine der Anforderungsmethoden ist, die Schreibvorgänge aktivieren (put, post, patch), muss der Anforderungs -Inhaltstyp -Header Anwendung/JSON sein, andernfalls wird die Anwendung den 415 nicht unterstützten Medientyp -HTTP -Statuscode beendet und anzeigt. Wenn alles einwandfrei funktioniert, wird die Anweisung $ this- & gt; als nächstes-call () die nächste Middleware in der Kette ausgeführt.
Authentifizierung
Da unsere Anwendung standardmäßig auf HTTPS ausgeführt wird, habe ich beschlossen, eine Methode zu verwenden, bei der Token Vorrang vor der grundlegenden Authentifizierung haben: API -Schlüssel werden an das Feld Benutzername des Basis -HTTP -Auth -Headers (kein Passwort erforderlich) gesendet). Zu diesem Zweck schrieb ich eine schlanke Middleware -Klasse namens tokenoverbasicauth, indem ich die vorhandene schlanke httpbasicicuth geändert habe. Diese Middleware läuft zuerst in der Kette, so dass sie als letzte hinzugefügt wird und im Konstruktor einen optionalen Root -Pfad -Parameter verwendet.
<code class="language-json">{ "name": "yourname/my-contacts", "description": "Simple RESTful API for contacts management", "license": "MIT", "authors": [ { "name": "Your Name", "email": "you@yourdomain.com" } ], "require": { "slim/slim": "*", "slim/extras": "*", "slim/middleware": "*", "monolog/monolog": "*", "j4mie/paris": "*", "flynsarmy/slim-monolog": "*" }, "archive": { "exclude": ["vendor", ".DS_Store", "*.log"] }, "autoload": { "psr-0": { "API": "lib/" } } }</code>
Diese Methode durchsucht den Header mit PHP_AUTH_USER -Anforderung für Auth -Token. Wenn sie nicht existiert oder ungültig ist, übergeben Sie den 401 verbotenen Status und Authentifizierungsheader an den Client. Die Verify () -Methode ist geschützt und kann daher durch Unterklassen überschrieben werden.
<code>bootstrap.php composer.json README.md bin/ import install lib/ API/ public/ .htaccess index.php share/ config/ default.php db/ logs/ sql/ data/ contacts.sql users.sql tables/ contacts.sql notes.sql users.sql ssl/ mysitename.crt mysitename.key</code>Hier überprüfe ich nur die Existenz des API -Schlüssels in der Benutzertabelle. Wenn ich einen gültigen Benutzer finde, wird er dem Anwendungskontext zur Verwendung mit der nächsten Schicht (Ratelimit) hinzugefügt. Sie können diese Klasse ändern oder erweitern, um Ihre eigene Authentifizierungslogik zu injizieren oder das OAuth -Modul zu verwenden. Weitere Informationen zu OAuth finden Sie auf dem Artikel von Jamie Munro.
verwendete Fehlernutzlast
Unsere API sollte nützliche Fehlermeldungen in einem verwendbaren Format anzeigen, vorzugsweise in JSON -Darstellung, wenn möglich. Wir benötigen eine minimale Nutzlast mit Fehlercodes und Nachrichten. Darüber hinaus erfordern Überprüfungsfehler mehr Segmentierung. Mit SLIM können wir 404-Fehler und Serverfehler mithilfe der Methoden $ App- & gt; NotFound () bzw. $ App- & gt; error () neu definieren.<code>URL HTTP Method Operation /api/contacts GET 返回联系人数组 /api/contacts/:id GET 返回 ID 为 :id 的联系人 /api/contacts POST 添加一个新联系人并返回它(添加了 id 属性) /api/contacts/:id PUT 更新 ID 为 :id 的联系人 /api/contacts/:id PATCH 部分更新 ID 为 :id 的联系人 /api/contacts/:id DELETE 删除 ID 为 :id 的联系人 /api/contacts/:id/star PUT 将 ID 为 :id 的联系人添加到收藏夹 /api/contacts/:id/star DELETE 从收藏夹中删除 ID 为 :id 的联系人 /api/contacts/:id/notes GET 返回 ID 为 :id 的联系人的笔记 /api/contacts/:id/notes/:nid GET 返回 ID 为 :id 的联系人的 ID 为 :nid 的笔记 /api/contacts/:id/notes POST 为 ID 为 :id 的联系人添加新笔记 /api/contacts/:id/notes/:nid PUT 更新 ID 为 :id 的联系人的 ID 为 :nid 的笔记 /api/contacts/:id/notes/:nid PATCH 部分更新 ID 为 :id 的联系人的 ID 为 :nid 的笔记 /api/contacts/:id/notes/:nid DELETE 删除 ID 为 :id 的联系人的 ID 为 :nid 的笔记</code>
Der Fehler wird nicht einfacher gefunden: Zuerst erhalte ich den angeforderten Medientyp, und dann sagt mir das $ isapi -Flag, ob sich die aktuelle URL unter der Gruppe /API /V* befindet. Wenn der Client die API -URL anfordert oder einen Header des JSON -Inhaltstyps sendet, werde ich die JSON -Ausgabe zurückgeben. Andernfalls kann ich die Vorlage rendern oder einfach statische HTML wie in diesem Beispiel gezeigt drucken. Andere Fehler sind etwas schwierig, und die Methode $ App- & gt; error () wird ausgelöst, wenn eine Ausnahme auftritt, und Slim konvertiert einen Standard-PHP-Fehler in ein Errorexception-Objekt. Wir brauchen eine Möglichkeit, Kunden nützliche Fehler zu liefern, ohne zu viele interne Mechanismen aufzudecken, um Sicherheitslücken zu vermeiden. Für diese Anwendung habe ich zwei benutzerdefinierte Ausnahmen erstellt, Apiexception und ApiexceptionValidationException, die der Öffentlichkeit ausgesetzt sind. Alle anderen Ausnahmetypen werden im Protokoll protokolliert und nur im Entwicklungsmodus angezeigt.
<code class="language-json">{ "name": "yourname/my-contacts", "description": "Simple RESTful API for contacts management", "license": "MIT", "authors": [ { "name": "Your Name", "email": "you@yourdomain.com" } ], "require": { "slim/slim": "*", "slim/extras": "*", "slim/middleware": "*", "monolog/monolog": "*", "j4mie/paris": "*", "flynsarmy/slim-monolog": "*" }, "archive": { "exclude": ["vendor", ".DS_Store", "*.log"] }, "autoload": { "psr-0": { "API": "lib/" } } }</code>Die Methode
$ app- & gt; error () empfängt die geworfene Ausnahme als Parameter. Standardmäßig erhalte ich alle Daten, die ich benötige, und füllen Sie das $ -Fehlerarray ein. Wenn ich dann im Produktionsmodus bin, werde ich die privaten Daten abnehmen und die Nachricht mit den allgemeinen Daten umschreiben. Die benutzerdefinierte ValidationException -Klasse enthält eine benutzerdefinierte getData () -Methode, mit der ein Array von Validierungsfehlern zur endgültigen Nutzlast hinzugefügt wird. Zeigen Sie dann den Fehler in JSON oder HTML anhand der Anforderung an. Auf der API -Seite können wir einen einfachen Fehler wie folgt haben:
<code>bootstrap.php composer.json README.md bin/ import install lib/ API/ public/ .htaccess index.php share/ config/ default.php db/ logs/ sql/ data/ contacts.sql users.sql tables/ contacts.sql notes.sql users.sql ssl/ mysitename.crt mysitename.key</code>
oder ein vollständiger Überprüfungsfehler wie unten gezeigt:
<code class="language-apache"><directory> # Required for mod_rewrite in .htaccess AllowOverride FileInfo Options All -Indexes DirectoryIndex index.php index.shtml index.html <ifmodule php5_module=""> # For Development only! php_flag display_errors On </ifmodule> # Enable gzip compression <ifmodule filter_module=""> AddOutputFilterByType DEFLATE application/json </ifmodule> Order deny,allow Deny from all Allow from 127.0.0.1 </directory> <virtualhost> ServerAdmin you@yourdomain.com DocumentRoot "/path/to/MyApp/public" ServerName myapp.dev <ifmodule rewrite_module=""> RewriteEngine on ## Throw a 403 (forbidden) status for non secure requests RewriteCond %{HTTPS} off RewriteRule ^.*$ - [L,R=403] </ifmodule> </virtualhost> <ifmodule ssl_module=""> NameVirtualHost *:443 Listen 443 SSLRandomSeed startup builtin SSLRandomSeed connect builtin <virtualhost> ServerAdmin you@yourdomain.com DocumentRoot "/path/to/MyApp/public" ServerName myapp.dev SSLEngine on SSLCertificateFile /path/to/MyApp/share/ssl/mysitename.crt SSLCertificateKeyFile /path/to/MyApp/share/ssl/mysitename.key SetEnv SLIM_MODE development </virtualhost> </ifmodule></code>
Schlussfolgerung
Wir haben jetzt den Kern der API. Im nächsten Abschnitt werden wir einige Inhalte hinzufügen, um einen voll funktionsfähigen Dienst zu erhalten. In dieser Zeit können Sie die in diesem Abschnitt verknüpften Artikel lesen - sie sind eine Schatzkammer nützlicher API -Designprinzipien.
FAQs (FAQ) zum Erstellen von REST -APIs von Grund auf
REST -API besteht aus mehreren Schlüsselkomponenten. Erstens ist die HTTP -Methode, die die Art der Operation definiert, die ausgeführt wird. Dazu gehören Get, Post, Put, Löschen usw. Die zweite Komponente ist eine URL oder URI, die die Ressourcenkennung ist. Die dritte Komponente ist der HTTP -Header, der die Metadaten von HTTP -Anforderungen und Antworten trägt. Die vierte Komponente ist die Körper- oder Nutzlast, die die tatsächlichen Daten trägt, die übertragen werden sollen. Schließlich gibt der Statuscode den Erfolg oder Misserfolg der HTTP -Anfrage an.
Schutz Ihrer REST -API ist für den Schutz sensibler Daten unerlässlich. Sie können verschiedene Methoden wie API -Schlüssel, OAuth oder JWT zur Authentifizierung und Autorisierung verwenden. Darüber hinaus wird die Datenübertragung immer verwendet, um die Datenintegrität und Vertraulichkeit zu gewährleisten. Aktualisieren Sie Ihre API und ihre Abhängigkeiten regelmäßig, um vor Sicherheitslücken zu schützen.
Versionierung Ihrer REST-API ermöglicht es Ihnen, nicht-zerstörerische Änderungen einzuführen, ohne bestehende Kunden zu beeinflussen. Sie können die API durch Einbeziehung der Versionsnummer in die URL oder einen benutzerdefinierten Anforderungsheader verwenden. Denken Sie daran, alle Änderungen zu protokollieren und Ihre API -Verbraucher über die neue Version und deren Funktionen zu informieren.
Die korrekte Fehlerbehandlung in der Rest -API verbessert die Benutzerfreundlichkeit und Zuverlässigkeit. Verwenden Sie einen HTTP -Statuscode, um den Fehlertyp anzugeben. Fügen Sie eine Fehlermeldung in die Antwortkörper ein, um weitere Informationen zum Fehler zu erhalten. Dies hilft dem Kunden zu verstehen, was falsch ist und wie das Problem gelöst werden kann.
Testen Sie Ihre REST -API, um sicherzustellen, dass sie wie erwartet funktioniert und eine Vielzahl von Szenarien bewältigen kann. Sie können Tools wie Postman oder Locken für manuelle Tests verwenden. Für automatisierte Tests sollten Sie Unit-Tests, Integrationstests und End-to-End-Tests verwenden. Verwenden Sie einen Mock -Server, um API -Antworten zu simulieren und zu testen, wie Ihre API verschiedene Arten von Antworten behandelt.
Gute Dokumentation macht Ihre REST -API leicht zu verstehen und zu verwenden. Enthält detaillierte Informationen zu Endpunkten, Anforderungsmethoden, Anforderungsparametern, Anforderungsbeispielen, Antwortstatuscodes und Antwortbeispiele. Sie können Tools wie Prahlerei oder Postbote verwenden, um Ihre API -Dokumente zu generieren und zu hosten.
Design Rastful APIs beinhaltet Planungsressourcen, Endpunkte und Methoden. Verwenden Sie Substantive für Ressourcen und HTTP -Methoden für Operationen. Halten Sie die API einfach und intuitiv. Verwenden Sie Statuscodes, um das Ergebnis der Anforderung anzugeben. Machen Sie Ihre API zu Staurlos, was bedeutet, dass jede Anfrage alle Informationen enthalten sollte, die Sie zur Bearbeitung der Anfrage benötigen.
Paging hilft, die in einer einzelnen Antwort zurückgegebene Datenmenge einzuschränken. Sie können Paging mit Abfrageparametern wie "Seite" und "Limit" implementieren. Geben Sie Metadaten in den Antwortheader oder die Leiche ein, um die aktuelle Seite, die Gesamtzahl der Seiten, die Gesamtzahl der Elemente usw. anzugeben.
Ratenbegrenzung schützt Ihre REST -API vor Missbrauch und sorgt für einen fairen Gebrauch. Sie können die Anzahl der Anforderungen basierend auf Ihrer IP -Adresse, Ihrem API -Schlüssel oder Ihrem Benutzerkonto einschränken. Verwenden Sie HTTP -Header, um dem Kunden den Status der Rate einzuschränken.
Sie können Ihre REST -API auf einer Server- oder Cloud -Plattform bereitstellen. Berücksichtigen Sie bei der Auswahl der Bereitstellungsoptionen Faktoren wie Kosten, Skalierbarkeit und Sicherheit. Verwenden Sie die kontinuierliche Integration und Continuous Delivery (CI/CD) -Tools, um den Bereitstellungsprozess zu automatisieren. Überwachen Sie Ihre API -Leistung und -nutzung, um sicherzustellen, dass sie den Anforderungen Ihrer Benutzer entsprechen.
Das obige ist der detaillierte Inhalt vonErstellen Sie eine REST -API von Grund auf neu: eine Einführung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!