


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-API ist für moderne Webdienste von entscheidender Bedeutung und bietet Entwicklern eine benutzerfreundliche Schnittstelle zum Zugriff auf und manipuliert Anwendungsdaten.
- Dokumente sind entscheidend.
- Slim Framework, kombiniert mit Tools wie Idiorm und Monolog, können leistungsstarke Funktionen zur Routing- und Middleware -Integration nutzen, um eine effiziente API -Entwicklung zu ermöglichen.
- Implementierung von HTTPS sorgt für eine sichere Kommunikation und verhindert den unbefugten Zugriff auf Daten, die zwischen Clients und Servern übertragen werden.
- Strukturierte Fehlerbehandlung im JSON -Format verbessert die Verfügbarkeit von APIs und liefert klare Fehlermeldungen und Code, die das Debuggen und Integration erleichtern.
- Authentifizierung durch Middleware wie Token über grundlegende Authentifizierung und JSON -Verarbeitung ist entscheidend, um API -Interaktionen effektiv zu schützen und zu verwalten.
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:
{ "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/" } } }
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.
ssl ist überall
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:
<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 *:80> 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 *:443> 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>
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
{ "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/" } } }
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:
<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 *:80> 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 *:443> 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>
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.
json Middleware
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.
// 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']);
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.
{ "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/" } } }
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>
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.
{ "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/" } } }
$ 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:
<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 *:80> 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 *:443> 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>
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
Was sind die Schlüsselkomponenten der Rest -API?
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.
Wie schützt ich meine Ruhe -API?
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.
Wie kann ich meine REST -API versionieren?
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.
Wie kann ich Fehler in der REST -API umgehen?
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.
Wie testet ich meine REST -API?
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.
Wie zeichne ich meine REST -API auf?
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.
Wie kann man eine erholsame API entwerfen?
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.
Wie kann man Ergebnisse in meiner Ruhe -API paginieren?
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.
Wie kann ich die Rate meiner REST -API einschränken?
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.
Wie kann ich meine REST -API bereitstellen?
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!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen











In PHP sollten die Funktionen für Passwort_Hash und passwart_verify verwendet werden, um sicheres Passwort -Hashing zu implementieren, und MD5 oder SHA1 sollte nicht verwendet werden. 1) Passwort_hash generiert einen Hash, der Salzwerte enthält, um die Sicherheit zu verbessern. 2) Passwort_Verify prüfen Sie das Passwort und sicherstellen Sie die Sicherheit, indem Sie die Hash -Werte vergleichen. 3) MD5 und SHA1 sind anfällig und fehlen Salzwerte und sind nicht für die Sicherheit der modernen Passwort geeignet.

PHP und Python haben jeweils ihre eigenen Vorteile und wählen nach den Projektanforderungen. 1.PHP ist für die Webentwicklung geeignet, insbesondere für die schnelle Entwicklung und Wartung von Websites. 2. Python eignet sich für Datenwissenschaft, maschinelles Lernen und künstliche Intelligenz mit prägnanter Syntax und für Anfänger.

PHP ist eine Skriptsprache, die auf der Serverseite weit verbreitet ist und insbesondere für die Webentwicklung geeignet ist. 1.PHP kann HTML einbetten, HTTP -Anforderungen und Antworten verarbeiten und eine Vielzahl von Datenbanken unterstützt. 2.PHP wird verwendet, um dynamische Webinhalte, Prozessformdaten, Zugriffsdatenbanken usw. mit starker Community -Unterstützung und Open -Source -Ressourcen zu generieren. 3. PHP ist eine interpretierte Sprache, und der Ausführungsprozess umfasst lexikalische Analyse, grammatikalische Analyse, Zusammenstellung und Ausführung. 4.PHP kann mit MySQL für erweiterte Anwendungen wie Benutzerregistrierungssysteme kombiniert werden. 5. Beim Debuggen von PHP können Sie Funktionen wie error_reporting () und var_dump () verwenden. 6. Optimieren Sie den PHP-Code, um Caching-Mechanismen zu verwenden, Datenbankabfragen zu optimieren und integrierte Funktionen zu verwenden. 7

PHP wird in E-Commerce, Content Management Systems und API-Entwicklung häufig verwendet. 1) E-Commerce: Wird für die Einkaufswagenfunktion und Zahlungsabwicklung verwendet. 2) Content -Management -System: Wird für die Erzeugung der dynamischen Inhalte und die Benutzerverwaltung verwendet. 3) API -Entwicklung: Wird für die erholsame API -Entwicklung und die API -Sicherheit verwendet. Durch Leistungsoptimierung und Best Practices werden die Effizienz und Wartbarkeit von PHP -Anwendungen verbessert.

PHP -Typ -Eingabeaufforderungen zur Verbesserung der Codequalität und der Lesbarkeit. 1) Tipps zum Skalartyp: Da Php7.0 in den Funktionsparametern wie int, float usw. angegeben werden dürfen. 3) Eingabeaufforderung für Gewerkschaftstyp: Da Php8.0 in Funktionsparametern oder Rückgabetypen angegeben werden dürfen. 4) Nullierstyp Eingabeaufforderung: Ermöglicht die Einbeziehung von Nullwerten und Handlungsfunktionen, die Nullwerte zurückgeben können.

PHP ist immer noch dynamisch und nimmt immer noch eine wichtige Position im Bereich der modernen Programmierung ein. 1) Einfachheit und leistungsstarke Unterstützung von PHP machen es in der Webentwicklung weit verbreitet. 2) Seine Flexibilität und Stabilität machen es ausstehend bei der Behandlung von Webformularen, Datenbankoperationen und Dateiverarbeitung; 3) PHP entwickelt sich ständig weiter und optimiert, geeignet für Anfänger und erfahrene Entwickler.

PHP eignet sich für die Webentwicklung, insbesondere für die schnelle Entwicklung und Verarbeitung dynamischer Inhalte, ist jedoch nicht gut in Anwendungen auf Datenwissenschaft und Unternehmensebene. Im Vergleich zu Python hat PHP mehr Vorteile in der Webentwicklung, ist aber nicht so gut wie Python im Bereich der Datenwissenschaft. Im Vergleich zu Java wird PHP in Anwendungen auf Unternehmensebene schlechter, ist jedoch flexibler in der Webentwicklung. Im Vergleich zu JavaScript ist PHP in der Back-End-Entwicklung präziser, ist jedoch in der Front-End-Entwicklung nicht so gut wie JavaScript.

PHP und Python haben ihre eigenen Vor- und Nachteile, und die Wahl hängt von den Projektbedürfnissen und persönlichen Vorlieben ab. 1.PHP eignet sich für eine schnelle Entwicklung und Wartung großer Webanwendungen. 2. Python dominiert das Gebiet der Datenwissenschaft und des maschinellen Lernens.
