


Erstellen Sie eine REST -API von Grund auf neu: eine Einführung
Feb 20, 2025 am 11:48 AM
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 返回聯(lián)系人數(shù)組 /api/contacts/:id GET 返回 ID 為 :id 的聯(lián)系人 /api/contacts POST 添加一個(gè)新聯(lián)系人并返回它(添加了 id 屬性) /api/contacts/:id PUT 更新 ID 為 :id 的聯(lián)系人 /api/contacts/:id PATCH 部分更新 ID 為 :id 的聯(lián)系人 /api/contacts/:id DELETE 刪除 ID 為 :id 的聯(lián)系人 /api/contacts/:id/star PUT 將 ID 為 :id 的聯(lián)系人添加到收藏夾 /api/contacts/:id/star DELETE 從收藏夾中刪除 ID 為 :id 的聯(lián)系人 /api/contacts/:id/notes GET 返回 ID 為 :id 的聯(lián)系人的筆記 /api/contacts/:id/notes/:nid GET 返回 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記 /api/contacts/:id/notes POST 為 ID 為 :id 的聯(lián)系人添加新筆記 /api/contacts/:id/notes/:nid PUT 更新 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記 /api/contacts/:id/notes/:nid PATCH 部分更新 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記 /api/contacts/:id/notes/:nid DELETE 刪除 ID 為 :id 的聯(lián)系人的 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/" } } }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.
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 返回聯(lián)系人數(shù)組 /api/contacts/:id GET 返回 ID 為 :id 的聯(lián)系人 /api/contacts POST 添加一個(gè)新聯(lián)系人并返回它(添加了 id 屬性) /api/contacts/:id PUT 更新 ID 為 :id 的聯(lián)系人 /api/contacts/:id PATCH 部分更新 ID 為 :id 的聯(lián)系人 /api/contacts/:id DELETE 刪除 ID 為 :id 的聯(lián)系人 /api/contacts/:id/star PUT 將 ID 為 :id 的聯(lián)系人添加到收藏夾 /api/contacts/:id/star DELETE 從收藏夾中刪除 ID 為 :id 的聯(lián)系人 /api/contacts/:id/notes GET 返回 ID 為 :id 的聯(lián)系人的筆記 /api/contacts/:id/notes/:nid GET 返回 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記 /api/contacts/:id/notes POST 為 ID 為 :id 的聯(lián)系人添加新筆記 /api/contacts/:id/notes/:nid PUT 更新 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記 /api/contacts/:id/notes/:nid PATCH 部分更新 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記 /api/contacts/:id/notes/:nid DELETE 刪除 ID 為 :id 的聯(lián)系人的 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 返回聯(lián)系人數(shù)組 /api/contacts/:id GET 返回 ID 為 :id 的聯(lián)系人 /api/contacts POST 添加一個(gè)新聯(lián)系人并返回它(添加了 id 屬性) /api/contacts/:id PUT 更新 ID 為 :id 的聯(lián)系人 /api/contacts/:id PATCH 部分更新 ID 為 :id 的聯(lián)系人 /api/contacts/:id DELETE 刪除 ID 為 :id 的聯(lián)系人 /api/contacts/:id/star PUT 將 ID 為 :id 的聯(lián)系人添加到收藏夾 /api/contacts/:id/star DELETE 從收藏夾中刪除 ID 為 :id 的聯(lián)系人 /api/contacts/:id/notes GET 返回 ID 為 :id 的聯(lián)系人的筆記 /api/contacts/:id/notes/:nid GET 返回 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記 /api/contacts/:id/notes POST 為 ID 為 :id 的聯(lián)系人添加新筆記 /api/contacts/:id/notes/:nid PUT 更新 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記 /api/contacts/:id/notes/:nid PATCH 部分更新 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記 /api/contacts/:id/notes/:nid DELETE 刪除 ID 為 :id 的聯(lián)系人的 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>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 返回聯(lián)系人數(shù)組 /api/contacts/:id GET 返回 ID 為 :id 的聯(lián)系人 /api/contacts POST 添加一個(gè)新聯(lián)系人并返回它(添加了 id 屬性) /api/contacts/:id PUT 更新 ID 為 :id 的聯(lián)系人 /api/contacts/:id PATCH 部分更新 ID 為 :id 的聯(lián)系人 /api/contacts/:id DELETE 刪除 ID 為 :id 的聯(lián)系人 /api/contacts/:id/star PUT 將 ID 為 :id 的聯(lián)系人添加到收藏夾 /api/contacts/:id/star DELETE 從收藏夾中刪除 ID 為 :id 的聯(lián)系人 /api/contacts/:id/notes GET 返回 ID 為 :id 的聯(lián)系人的筆記 /api/contacts/:id/notes/:nid GET 返回 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記 /api/contacts/:id/notes POST 為 ID 為 :id 的聯(lián)系人添加新筆記 /api/contacts/:id/notes/:nid PUT 更新 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記 /api/contacts/:id/notes/:nid PATCH 部分更新 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記 /api/contacts/:id/notes/:nid DELETE 刪除 ID 為 :id 的聯(lián)系人的 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/" } } }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:
<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

Undress AI Tool
Ausziehbilder kostenlos

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

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

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)

H?ufige Probleme und L?sungen für den variablen PHP -Umfang umfassen: 1. Die globale Variable kann innerhalb der Funktion nicht zugegriffen werden, und sie muss bei der Verwendung des globalen Schlüsselworts oder Parameters übergeben werden. 2. Die statische Variable wird statisch deklariert und nur einmal initialisiert und der Wert wird zwischen mehreren Aufrufen beibehalten. 3.. Hyperglobale Variablen wie $ _get und $ _post k?nnen direkt in jedem Bereich verwendet werden, aber Sie müssen auf eine sichere Filterung achten. 4. Die anonymen Funktionen müssen über das Schlüsselwort verwenden, und wenn Sie externe Variablen ?ndern, müssen Sie eine Referenz übergeben. Das Beherrschen dieser Regeln kann dazu beitragen, Fehler zu vermeiden und die Code -Stabilit?t zu verbessern.

Um PHP -Datei -Uploads sicher zu verarbeiten, müssen Sie die Quelle und die Type und die Eingabe des Dateinamens und des Pfades überprüfen, Serverbeschr?nkungen festlegen und Mediendateien zweimal verarbeiten. 1. überprüfen Sie die Upload -Quelle, um CSRF durch Token zu verhindern, und erkennen Sie den realen MIME -Typ über die Finfo_file mithilfe der Whitelist -Steuerung. 2. Benennen Sie die Datei in eine zuf?llige Zeichenfolge um und bestimmen Sie die Erweiterung, um sie gem?? dem Erkennungstyp in einem Verzeichnis ohne Web zu speichern. 3. Die PHP -Konfiguration begrenzt die Hochladengr??e und das tempor?re Verzeichnis Nginx/Apache verbietet den Zugriff auf das Upload -Verzeichnis. 4. Die GD -Bibliothek stellt die Bilder neu, um potenzielle b?swillige Daten zu l?schen.

Es gibt drei g?ngige Methoden für den PHP -Kommentarcode: 1. Verwenden Sie // oder #, um eine Codezeile zu blockieren, und es wird empfohlen, // zu verwenden. 2. Verwenden Sie /.../, um Codebl?cke mit mehreren Zeilen zu wickeln, die nicht verschachtelt werden k?nnen, aber gekreuzt werden k?nnen. 3.. Kombinationskenntnisse Kommentare wie die Verwendung / if () {} / Um Logikbl?cke zu steuern oder um die Effizienz mit Editor -Verknüpfungsschlüssel zu verbessern, sollten Sie auf die Schlie?ung von Symbolen achten und das Verschachteln bei der Verwendung vermeiden.

AgneeratorinphpiSamemory-effizientes WaytoiterateOverlargedatasetsByyieldingValueatimeinsteadofReturningThemallatonce.1.GeneratorsusetheyieldKeywordtoproduktenvaluesonDemand, ReducingMemoryUsage.2.TheyareusefulforfulforfulfordlingBiglopploups, Lesebiglochen, Leselungen, Lesebigs, Leselung, oder

Der Schlüssel zum Schreiben von PHP -Kommentaren liegt in der Kl?rung des Zwecks und der Spezifikationen. Kommentare sollten "Warum" und nicht "was getan" erkl?ren, um Redundanz oder zu Einfachheit zu vermeiden. 1. Verwenden Sie ein einheitliches Format wie Docblock (/*/) für Klassen- und Methodenbeschreibungen, um die Lesbarkeit und die Kompatibilit?t der Werkzeuge zu verbessern. 2. Betonen Sie die Gründe für die Logik, z. B. warum JS -Sprünge manuell ausgeben müssen. 3. Fügen Sie eine übersichtsbeschreibung vor komplexem Code hinzu, beschreiben Sie den Prozess in Schritten und helfen Sie, die Gesamtidee zu verstehen. V. Gute Anmerkungen k?nnen die Kommunikationskosten senken und die Effizienz der Code -Wartung verbessern.

Toinstallphpquickly, usexampponwindowsorhomebrewonmacos.1.onwindows, download undInstallxampp, SelectComponents, Startapache und PlaceFilesinhtdocscs.2.Anternativ, manuellinstallphpfrfr

In PHP k?nnen Sie quadratische Klammern oder lockige Klammern verwenden, um Zeichenfolgenspezifikationsspezifische Indexzeichen zu erhalten, aber quadratische Klammern werden empfohlen. Der Index startet von 0 und der Zugriff au?erhalb des Bereichs gibt einen Nullwert zurück und kann keinen Wert zugewiesen; MB_SUBSTR ist erforderlich, um Multi-Byte-Zeichen zu verarbeiten. Zum Beispiel: $ str = "Hallo"; echo $ str [0]; Ausgabe H; und chinesische Zeichen wie Mb_Substr ($ str, 1,1) müssen das richtige Ergebnis erzielen. In den tats?chlichen Anwendungen sollte die L?nge der Zeichenfolge vor dem Schleifen überprüft werden, dynamische Zeichenfolgen müssen für die Gültigkeit verifiziert werden, und mehrsprachige Projekte empfehlen, Multi-Byte-Sicherheitsfunktionen einheitlich zu verwenden.

Tolearnphpeffectival, startbysettingupalocalerverenVironmentusexs -LikexamppandacodeeditorikevScode.1) InstallxamppForapache, MySQL und Php.SeacodeeditorForsyntaxSupport.3) testyourscludingveliktingveliktelaThbiliodble.Neclyble.NektFile
