suchen
HeimBackend-EntwicklungPHP-TutorialErstellen Sie eine REST -API von Grund auf neu: eine Einführung

Build a REST API from Scratch: An Introduction

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/"
    }
  }
}
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          返回联系人数组
/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 .php vorhanden ist, wird sie geladen, andernfalls wird die Standardkonfigurationsdatei geladen. Slim spezifische Einstellungen werden im Array $ config ['App'] gespeichert und an den Konstruktor der Anwendung übergeben, das das grundlegende schlanke Objekt erweitert (optional, aber empfohlen). Zum Beispiel Anweisung:

{
  "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>
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.

{
  "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!

Stellungnahme
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
11 beste PHP -URL -Shortener -Skripte (kostenlos und Premium)11 beste PHP -URL -Shortener -Skripte (kostenlos und Premium)Mar 03, 2025 am 10:49 AM

Lange URLs, die oft mit Schlüsselwörtern und Tracking -Parametern überfüllt sind, können Besucher abschrecken. Ein URL -Verkürzungsskript bietet eine Lösung, die präzise Links erstellt, die ideal für soziale Medien und andere Plattformen sind. Diese Skripte sind für einzelne Websites a wertvoll

Arbeiten mit Flash -Sitzungsdaten in LaravelArbeiten mit Flash -Sitzungsdaten in LaravelMar 12, 2025 pm 05:08 PM

Laravel vereinfacht die Behandlung von temporären Sitzungsdaten mithilfe seiner intuitiven Flash -Methoden. Dies ist perfekt zum Anzeigen von kurzen Nachrichten, Warnungen oder Benachrichtigungen in Ihrer Anwendung. Die Daten bestehen nur für die nachfolgende Anfrage standardmäßig: $ Anfrage-

Erstellen Sie eine React -App mit einem Laravel -Back -Ende: Teil 2, reagierenErstellen Sie eine React -App mit einem Laravel -Back -Ende: Teil 2, reagierenMar 04, 2025 am 09:33 AM

Dies ist der zweite und letzte Teil der Serie zum Aufbau einer Reaktionsanwendung mit einem Laravel-Back-End. Im ersten Teil der Serie haben wir eine erholsame API erstellt, die Laravel für eine grundlegende Produktlistenanwendung unter Verwendung von Laravel erstellt hat. In diesem Tutorial werden wir Dev sein

Vereinfachte HTTP -Reaktion verspottet in Laravel -TestsVereinfachte HTTP -Reaktion verspottet in Laravel -TestsMar 12, 2025 pm 05:09 PM

Laravel bietet eine kurze HTTP -Antwortsimulationssyntax und vereinfache HTTP -Interaktionstests. Dieser Ansatz reduziert die Code -Redundanz erheblich, während Ihre Testsimulation intuitiver wird. Die grundlegende Implementierung bietet eine Vielzahl von Verknüpfungen zum Antworttyp: Verwenden Sie Illuminate \ Support \ facades \ http; Http :: fake ([ 'Google.com' => 'Hallo Welt',, 'github.com' => ['foo' => 'bar'], 'Forge.laravel.com' =>

Curl in PHP: So verwenden Sie die PHP -Curl -Erweiterung in REST -APIsCurl in PHP: So verwenden Sie die PHP -Curl -Erweiterung in REST -APIsMar 14, 2025 am 11:42 AM

Die PHP Client -URL -Erweiterung (CURL) ist ein leistungsstarkes Tool für Entwickler, das eine nahtlose Interaktion mit Remote -Servern und REST -APIs ermöglicht. Durch die Nutzung von Libcurl, einer angesehenen Bibliothek mit Multi-Protokoll-Dateien, erleichtert PHP Curl effiziente Execu

12 Beste PHP -Chat -Skripte auf Codecanyon12 Beste PHP -Chat -Skripte auf CodecanyonMar 13, 2025 pm 12:08 PM

Möchten Sie den dringlichsten Problemen Ihrer Kunden in Echtzeit und Sofortlösungen anbieten? Mit Live-Chat können Sie Echtzeitgespräche mit Kunden führen und ihre Probleme sofort lösen. Sie ermöglichen es Ihnen, Ihrem Brauch einen schnelleren Service zu bieten

Ankündigung von 2025 PHP Situation SurveyAnkündigung von 2025 PHP Situation SurveyMar 03, 2025 pm 04:20 PM

Die 2025 PHP Landscape Survey untersucht die aktuellen PHP -Entwicklungstrends. Es untersucht Framework -Nutzung, Bereitstellungsmethoden und Herausforderungen, die darauf abzielen, Entwicklern und Unternehmen Einblicke zu geben. Die Umfrage erwartet das Wachstum der modernen PHP -Versio

Benachrichtigungen in LaravelBenachrichtigungen in LaravelMar 04, 2025 am 09:22 AM

In diesem Artikel werden wir das Benachrichtigungssystem im Laravel -Web -Framework untersuchen. Mit dem Benachrichtigungssystem in Laravel können Sie Benachrichtigungen an Benutzer über verschiedene Kanäle senden. Heute werden wir diskutieren, wie Sie Benachrichtigungen OV senden können

See all articles

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Sicherer Prüfungsbrowser

Sicherer Prüfungsbrowser

Safe Exam Browser ist eine sichere Browserumgebung für die sichere Teilnahme an Online-Prüfungen. Diese Software verwandelt jeden Computer in einen sicheren Arbeitsplatz. Es kontrolliert den Zugriff auf alle Dienstprogramme und verhindert, dass Schüler nicht autorisierte Ressourcen nutzen.

SublimeText3 Linux neue Version

SublimeText3 Linux neue Version

SublimeText3 Linux neueste Version

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)