Einzeldatei-PHP-Skript, das eine REST-API zu einer MySQL/MariaDB-, PostgreSQL-, SQL Server- oder SQLite-Datenbank hinzufügt.
Anleitung: Laden Sie „ api.php
“ auf Ihren Webserver hoch, konfigurieren Sie es für die Verbindung mit Ihrer Datenbank und erhalten Sie sofort eine voll funktionsfähige REST-API.
Hinweis: Dies ist die TreeQL-Referenzimplementierung in PHP.
PHP 7.2 oder höher mit aktivierten PDO-Treibern für eines dieser Datenbanksysteme:
MySQL 5.7 / MariaDB 10.0 oder höher für räumliche Funktionen in MySQL
PostgreSQL 9.5 oder höher mit PostGIS 2.2 oder höher für räumliche Funktionen
SQL Server 2017 oder höher (2019 bietet auch Linux-Unterstützung)
SQLite 3.16 oder höher (räumliche Funktionen werden NICHT unterstützt)
Laden Sie die Datei „ api.php
“ aus der neuesten Version herunter:
https://github.com/mevdschee/php-crud-api/releases/latest oder direkt von:
https://raw.githubusercontent.com/mevdschee/php-crud-api/main/api.php
Dies ist eine Einzeldatei-Bewerbung! Laden Sie „ api.php
“ irgendwo hoch und genießen Sie es!
Für die lokale Entwicklung können Sie den integrierten Webserver von PHP ausführen:
php -S localhost:8080
Testen Sie das Skript, indem Sie die folgende URL öffnen:
http://localhost:8080/api.php/records/posts/1
Vergessen Sie nicht, die Konfiguration am Ende der Datei zu ändern.
Alternativ können Sie dieses Projekt in das Webframework Ihrer Wahl integrieren, siehe:
Automatische REST-API für Laravel
Automatische REST-API für Symfony 4
Automatische REST-API für SlimPHP 4
In diesen Integrationen wird Composer verwendet, um dieses Projekt als Abhängigkeit zu laden.
Für Personen, die Composer nicht verwenden, wird die Datei „ api.include.php
“ bereitgestellt. Diese Datei enthält alles aus „ api.php
“ mit Ausnahme der Konfiguration aus „ src/index.php
“ und kann von der „include“-Funktion von PHP verwendet werden.
Bearbeiten Sie die folgenden Zeilen am Ende der Datei „ api.php
“:
$config = new Config([ 'username' => 'xxx', 'password' => 'xxx', 'database' => 'xxx', ]);
Dies sind alle Konfigurationsoptionen und ihre Standardwerte in Klammern:
„Treiber“: mysql
, pgsql
, sqlsrv
oder sqlite
( mysql
)
„Adresse“: Hostname (oder Dateiname) des Datenbankservers ( localhost
)
„port“: TCP-Port des Datenbankservers (standardmäßig der Treiberstandard)
„Benutzername“: Benutzername des Benutzers, der eine Verbindung zur Datenbank herstellt (kein Standardwert)
„Passwort“: Passwort des Benutzers, der sich mit der Datenbank verbindet (kein Standardwert)
„Datenbank“: Datenbank, zu der die Verbindung hergestellt wird (kein Standardwert)
„Befehl“: Zusätzliches SQL zum Initialisieren der Datenbankverbindung (keine)
„Tabellen“: Durch Kommas getrennte Liste der zu veröffentlichenden Tabellen (standardmäßig „alle“)
„mapping“: Kommagetrennte Liste der Tabellen-/Spaltenzuordnungen (keine Zuordnung)
„geometrySrid“: SRID wird beim Konvertieren von WKT in Geometrie angenommen ( 4326
)
„middlewares“: Liste der zu ladenden Middlewares ( cors
)
„Controller“: Liste der zu ladenden Controller ( records,geojson,openapi,status
)
„customControllers“: Liste der vom Benutzer zu ladenden benutzerdefinierten Controller (kein Standardwert)
„openApiBase“: OpenAPI-Informationen ( {"info":{"title":"PHP-CRUD-API","version":"1.0.0"}}
)
„cacheType“: TempFile
, Redis
, Memcache
, Memcached
oder NoCache
( TempFile
)
„cachePath“: Pfad/Adresse des Caches (standardmäßig das temporäre Verzeichnis des Systems)
„cacheTime“: Anzahl der Sekunden, die der Cache gültig ist ( 10
)
„jsonOptions“: Optionen für die JSON-Kodierung ( JSON_UNESCAPED_UNICODE
)
„debug“: Fehler in den „X-Exception“-Headern anzeigen ( false
)
„basePath“: URI-Basispfad der API (standardmäßig mit PATH_INFO ermittelt)
Alle Konfigurationsmöglichkeiten stehen auch als Umgebungsvariablen zur Verfügung. Schreiben Sie die Konfigurationsoption mit Großbuchstaben, einem „PHP_CRUD_API_“-Präfix und Unterstrichen für Wortumbrüche, also zum Beispiel:
PHP_CRUD_API_DRIVER=mysql
PHP_CRUD_API_ADDRESS=localhost
PHP_CRUD_API_PORT=3306
PHP_CRUD_API_DATABASE=php-crud-api
PHP_CRUD_API_USERNAME=php-crud-api
PHP_CRUD_API_PASSWORD=php-crud-api
PHP_CRUD_API_DEBUG=1
Die Umgebungsvariablen haben Vorrang vor der PHP-Konfiguration.
Es gelten folgende Einschränkungen und Einschränkungen:
Primärschlüssel sollten entweder eine automatische Inkrementierung (von 1 bis 2^53) oder eine UUID sein
Zusammengesetzte Primär- und zusammengesetzte Fremdschlüssel werden nicht unterstützt
Komplexe Schreibvorgänge (Transaktionen) werden nicht unterstützt
Komplexe Abfragen, die Funktionen (wie „concat“ oder „sum“) aufrufen, werden nicht unterstützt
Die Datenbank muss Fremdschlüsseleinschränkungen unterstützen und definieren
SQLite kann keine automatisch inkrementierenden Primärschlüssel vom Typ bigint haben
SQLite unterstützt das Ändern von Tabellenspalten (Struktur) nicht.
Die folgenden Funktionen werden unterstützt:
Composer-Installation oder einzelne PHP-Datei, einfach bereitzustellen.
Sehr wenig Code, einfach anzupassen und zu warten
Unterstützt POST-Variablen als Eingabe (x-www-form-urlencoded)
Unterstützt ein JSON-Objekt als Eingabe
Unterstützt ein JSON-Array als Eingabe (Batch-Einfügung)
Bereinigen und validieren Sie Eingaben mithilfe von Typregeln und Rückrufen
Berechtigungssystem für Datenbanken, Tabellen, Spalten und Datensätze
Es werden mehrmandantenfähige Einzel- und Multidatenbank-Layouts unterstützt
Multi-Domain-CORS-Unterstützung für domänenübergreifende Anfragen
Unterstützung für das Lesen verknüpfter Ergebnisse aus mehreren Tabellen
Suchunterstützung nach mehreren Kriterien
Paginierung, Sortierung, Top-N-Liste und Spaltenauswahl
Beziehungserkennung mit verschachtelten Ergebnissen (belongsTo, hasMany und HABTM)
Unterstützung für atomare Inkremente über PATCH (für Zähler)
Binäre Felder werden mit Base64-Codierung unterstützt
Mit WKT und GeoJSON unterstützte räumliche/GIS-Felder und Filter
Zuordnung von Tabellen- und Spaltennamen zur Unterstützung älterer Systeme
Generieren Sie API-Dokumentation mit OpenAPI-Tools
Authentifizierung über API-Schlüssel, JWT-Token oder Benutzername/Passwort
Datenbankverbindungsparameter können von der Authentifizierung abhängen
Unterstützung für das Lesen der Datenbankstruktur in JSON
Unterstützung für die Änderung der Datenbankstruktur mithilfe des REST-Endpunkts
Die sicherheitssteigernde Middleware ist im Lieferumfang enthalten
Standardkonform: PSR-4, PSR-7, PSR-12, PSR-15 und PSR-17
Verwandte Projekte:
PHP-CRUD-API-Schnellstart: Eine anpassbare, sofort einsatzbereite Docker-Compose-Datei mit PHP-CRUD-API.
PHP-CRUD-API-Filtergenerator: Eine JavaScript-Bibliothek, die PHP-CRUD-API-Filter aus Ausdrücken erstellt.
JS-CRUD-API: Eine JavaScript-Client-Bibliothek für die API von PHP-CRUD-API
PHP-API-AUTH: Einzeldatei-PHP-Skript, das ein Authentifizierungsanbieter für PHP-CRUD-API ist
PHP-CRUD-UI: Einzeldatei-PHP-Skript, das einem PHP-CRUD-API-Projekt eine Benutzeroberfläche hinzufügt.
PHP-CRUD-ADMIN: Einzeldatei-PHP-Skript, das einem PHP-CRUD-API-Projekt eine Datenbankadministrationsschnittstelle hinzufügt.
PHP-SP-API: Einzeldatei-PHP-Skript, das einer SQL-Datenbank eine REST-API hinzufügt.
dexie-mysql-sync: Synchronisierung zwischen lokaler IndexedDB und MySQL-Datenbank.
ra-data-treeql: NPM-Paket, das einen Datenanbieter für React Admin bereitstellt.
scriptPilot/vueuse: Vue Composables zusätzlich zu VueUse.org (die PHP-CRUD-API unterstützen).
scriptPilot/add-php-backend: Fügen Sie MySQL, phpMyAdmin und PHP-CRUD-API zu Ihrer Entwicklungsumgebung hinzu.
VUE-CRUD-UI: Einzeldatei-Vue.js-Skript, das einem PHP-CRUD-API-Projekt eine Benutzeroberfläche hinzufügt.
Es gibt auch Portierungen dieses Skripts in:
Go-CRUD-API (in Arbeit)
Java JDBC von Ivan Kolchagov (v1)
Java Spring Boot + jOOQ (v2: in Arbeit)
Es gibt auch Proof-of-Concept-Ports dieses Skripts, die nur grundlegende REST CRUD-Funktionen unterstützen in: PHP, Java, Go, C# .net Core, Node.js und Python.
Sie können alle Abhängigkeiten dieses Projekts mit dem folgenden Befehl installieren:
php install.php
Sie können alle Dateien in einer einzigen „ api.php
“-Datei kompilieren, indem Sie Folgendes verwenden:
php build.php
Beachten Sie, dass Sie die Kompilierung nicht verwenden, wenn Sie dieses Projekt in ein anderes Projekt oder Framework integrieren (verwenden Sie stattdessen Composer).
Sie können auf den nicht kompilierten Code unter der URL zugreifen:
http://localhost:8080/src/records/posts/1
Der nicht kompilierte Code befindet sich in den Verzeichnissen „ src
“ und „ vendor
“. Das Verzeichnis „ vendor
“ enthält die Abhängigkeiten.
Sie können alle Abhängigkeiten dieses Projekts mit dem folgenden Befehl aktualisieren:
php update.php
Dieses Skript installiert und führt Composer aus, um die Abhängigkeiten zu aktualisieren.
Hinweis: Das Update-Skript patcht die Abhängigkeiten im Herstellerverzeichnis, um die Kompatibilität mit PHP 7.0 zu gewährleisten.
Mit TreeQL können Sie einen „Baum“ von JSON-Objekten basierend auf Ihrer SQL-Datenbankstruktur (Beziehungen) und Ihrer Abfrage erstellen.
Es basiert lose auf dem REST-Standard und ist auch von json:api inspiriert.
Die Beispiel-Beitragstabelle enthält nur wenige Felder:
posts ======= id title content created
Die folgenden CRUD + List-Operationen wirken sich auf diese Tabelle aus.
Wenn Sie einen Datensatz erstellen möchten, kann die Anfrage im URL-Format wie folgt geschrieben werden:
POST /records/posts
Sie müssen einen Text senden, der Folgendes enthält:
{ "title": "Black is the new red", "content": "This is the second post.", "created": "2018-03-06T21:34:01Z" }
Und es wird der Wert des Primärschlüssels des neu erstellten Datensatzes zurückgegeben:
2
Um einen Datensatz aus dieser Tabelle zu lesen, kann die Anfrage im URL-Format wie folgt geschrieben werden:
GET /records/posts/1
Dabei ist „1“ der Wert des Primärschlüssels des Datensatzes, den Sie lesen möchten. Es wird zurückgegeben:
{ "id": 1 "title": "Hello world!", "content": "Welcome to the first post.", "created": "2018-03-05T20:12:56Z" }
Bei Lesevorgängen können Sie Joins anwenden.
Um einen Datensatz in dieser Tabelle zu aktualisieren, kann die Anfrage im URL-Format wie folgt geschrieben werden:
PUT /records/posts/1
Dabei ist „1“ der Wert des Primärschlüssels des Datensatzes, den Sie aktualisieren möchten. Als Text senden:
{ "title": "Adjusted title!" }
Dadurch wird der Titel des Beitrags angepasst. Und der Rückgabewert ist die Anzahl der gesetzten Zeilen:
1
Wenn Sie einen Datensatz aus dieser Tabelle löschen möchten, kann die Anfrage im URL-Format wie folgt geschrieben werden:
DELETE /records/posts/1
Und es wird die Anzahl der gelöschten Zeilen zurückgegeben:
1
Um Datensätze aus dieser Tabelle aufzulisten, kann die Anfrage im URL-Format wie folgt geschrieben werden:
GET /records/posts
Es wird zurückgegeben:
{ "records":[ { "id": 1, "title": "Hello world!", "content": "Welcome to the first post.", "created": "2018-03-05T20:12:56Z" } ] }
Bei Listenoperationen können Sie Filter und Verknüpfungen anwenden.
Filter bieten Suchfunktionen bei Listenaufrufen mithilfe des Parameters „filter“. Sie müssen den Spaltennamen, ein Komma, den Match-Typ, ein weiteres Komma und den Wert angeben, nach dem Sie filtern möchten. Dies sind die unterstützten Match-Typen:
„cs“: Zeichenfolge enthalten (Zeichenfolge enthält Wert)
„sw“: start with (Zeichenfolge beginnt mit Wert)
„ew“: end with (String endet mit Wert)
„eq“: gleich (Zeichenfolge oder Zahl stimmt genau überein)
„lt“: kleiner als (Zahl ist kleiner als Wert)
„le“: kleiner oder gleich (Zahl ist kleiner oder gleich dem Wert)
„ge“: größer oder gleich (Zahl ist größer oder gleich Wert)
„gt“: größer als (Zahl ist größer als Wert)
„bt“: zwischen (Zahl liegt zwischen zwei durch Kommas getrennten Werten)
„in“: in (Zahl oder Zeichenfolge ist eine durch Kommas getrennte Werteliste)
„is“: ist null (Feld enthält „NULL“-Wert)
Sie können alle Filter negieren, indem Sie ein „n“ voranstellen, sodass „eq“ zu „neq“ wird. Beispiele für die Verwendung von Filtern sind:
GET /records/categories?filter=name,eq,Internet GET /records/categories?filter=name,sw,Inter GET /records/categories?filter=id,le,1 GET /records/categories?filter=id,ngt,1 GET /records/categories?filter=id,bt,0,1 GET /records/categories?filter=id,in,0,1
Ausgabe:
{ "records":[ { "id": 1 "name": "Internet" } ] }
Im nächsten Abschnitt gehen wir näher darauf ein, wie Sie mehrere Filter auf einen einzelnen Listenaufruf anwenden können.
Filter können durch Wiederholen des Parameters „filter“ in der URL angewendet werden. Zum Beispiel die folgende URL:
GET /records/categories?filter=id,gt,1&filter=id,lt,3
fordert alle Kategorien an, „wobei id > 1 und id < 3“ ist. Wenn Sie „wobei id = 2 oder id = 4“ möchten, sollten Sie Folgendes schreiben:
GET /records/categories?filter1=id,eq,2&filter2=id,eq,4
Wie Sie sehen, haben wir dem Parameter „filter“ eine Zahl hinzugefügt, um anzugeben, dass „OR“ anstelle von „AND“ angewendet werden soll. Beachten Sie, dass Sie „filter1“ auch wiederholen und ein „AND“ innerhalb eines „OR“ erstellen können. Da Sie durch Hinzufügen eines Buchstabens (af) auch eine Ebene tiefer gehen können, können Sie nahezu jeden halbwegs komplexen Bedingungsbaum erstellen.
Hinweis: Sie können nur nach der angeforderten Tabelle filtern (nicht nach den darin enthaltenen Tabellen) und Filter werden nur auf Listenaufrufe angewendet.
Standardmäßig sind alle Spalten ausgewählt. Mit dem Parameter „include“ können Sie bestimmte Spalten auswählen. Sie können einen Punkt verwenden, um den Tabellennamen vom Spaltennamen zu trennen. Mehrere Spalten sollten durch Kommas getrennt werden. Ein Sternchen („*“) kann als Platzhalter verwendet werden, um „alle Spalten“ anzugeben. Ähnlich wie bei „include“ können Sie den Parameter „exclude“ verwenden, um bestimmte Spalten zu entfernen:
GET /records/categories/1?include=name GET /records/categories/1?include=categories.name GET /records/categories/1?exclude=categories.id
Ausgabe:
{ "name": "Internet" }
Hinweis: Spalten, die zur Einbeziehung verwandter Entitäten verwendet werden, werden automatisch hinzugefügt und können nicht aus der Ausgabe weggelassen werden.
Mit dem Parameter „order“ können Sie sortieren. Standardmäßig erfolgt die Sortierung in aufsteigender Reihenfolge, aber durch Angabe von „desc“ kann dies umgekehrt werden:
GET /records/categories?order=name,desc GET /records/categories?order=id,desc&order=name
Ausgabe:
{ "records":[ { "id": 3 "name": "Web development" }, { "id": 1 "name": "Internet" } ] }
Hinweis: Sie können nach mehreren Feldern sortieren, indem Sie mehrere „Reihenfolge“-Parameter verwenden. Sie können nicht auf „verbundenen“ Spalten bestellen.
Der Parameter „size“ begrenzt die Anzahl der zurückgegebenen Datensätze. Dies kann für Top-N-Listen zusammen mit dem Parameter „order“ (absteigende Reihenfolge verwenden) verwendet werden.
GET /records/categories?order=id,desc&size=1
Ausgabe:
{ "records":[ { "id": 3 "name": "Web development" } ] }
Hinweis: Wenn Sie auch die Gesamtzahl der Datensätze wissen möchten, können Sie den Parameter „Seite“ verwenden.
Der Parameter „page“ enthält die angeforderte Seite. Die Standardseitengröße beträgt 20, kann aber angepasst werden (z. B. auf 50).
GET /records/categories?order=id&page=1 GET /records/categories?order=id&page=1,50
Ausgabe:
{ "records":[ { "id": 1 "name": "Internet" }, { "id": 3 "name": "Web development" } ], "results": 2 }
Das Element „results“ enthält die Gesamtzahl der Datensätze in der Tabelle, die zurückgegeben würden, wenn keine Paginierung verwendet würde.
Hinweis: Da nicht geordnete Seiten nicht paginiert werden können, werden die Seiten nach Primärschlüssel geordnet.
Nehmen wir an, Sie haben eine Beitragstabelle mit Kommentaren (von Benutzern) und die Beiträge können Tags haben.
posts comments users post_tags tags ======= ======== ======= ========= ======= id id id id id title post_id username post_id name content user_id phone tag_id created message
Wenn Sie Beiträge mit ihren Kommentaren, Benutzern und Tags auflisten möchten, können Sie nach zwei „Baum“-Pfaden fragen:
posts -> comments -> users posts -> post_tags -> tags
Diese Pfade haben denselben Stamm und diese Anfrage kann im URL-Format wie folgt geschrieben werden:
GET /records/posts?join=comments,users&join=tags
Hier dürfen Sie die Zwischentabelle weglassen, die Beiträge an Tags bindet. In diesem Beispiel sehen Sie alle drei Tabellenbeziehungstypen (hasMany, gehörtTo und hasAndBelongsToMany) in Wirkung:
„Beitrag“ hat viele „Kommentare“
„Kommentar“ gehört „Benutzer“
„Beitrag“ hat und gehört zu vielen „Tags“
Dies kann zu den folgenden JSON-Daten führen:
{ "records":[ { "id": 1, "title": "Hello world!", "content": "Welcome to the first post.", "created": "2018-03-05T20:12:56Z", "comments": [ { id: 1, post_id: 1, user_id: { id: 1, username: "mevdschee", phone: null, }, message: "Hi!" }, { id: 2, post_id: 1, user_id: { id: 1, username: "mevdschee", phone: null, }, message: "Hi again!" } ], "tags": [] }, { "id": 2, "title": "Black is the new red", "content": "This is the second post.", "created": "2018-03-06T21:34:01Z", "comments": [], "tags": [ { id: 1, message: "Funny" }, { id: 2, message: "Informational" } ] } ] }
Sie sehen, dass die „belongsTo“-Beziehungen erkannt werden und der Fremdschlüsselwert durch das referenzierte Objekt ersetzt wird. Im Fall von „hasMany“ und „hasAndBelongsToMany“ wird der Tabellenname als neue Eigenschaft für das Objekt verwendet.
Wenn Sie erstellen, lesen, aktualisieren oder löschen möchten, können Sie in der URL mehrere Primärschlüsselwerte angeben. Außerdem müssen Sie zum Erstellen und Aktualisieren ein Array anstelle eines Objekts im Anforderungstext senden.
Um einen Datensatz aus dieser Tabelle zu lesen, kann die Anfrage im URL-Format wie folgt geschrieben werden:
GET /records/posts/1,2
Das Ergebnis kann sein:
[ { "id": 1, "title": "Hello world!", "content": "Welcome to the first post.", "created": "2018-03-05T20:12:56Z" }, { "id": 2, "title": "Black is the new red", "content": "This is the second post.", "created": "2018-03-06T21:34:01Z" } ]
Wenn Sie eine Stapelaktualisierung durchführen möchten, lautet die Anfrage im URL-Format ähnlich wie folgt:
PUT /records/posts/1,2
Dabei sind „1“ und „2“ die Werte der Primärschlüssel der Datensätze, die Sie aktualisieren möchten. Der Textkörper sollte die gleiche Anzahl an Objekten enthalten, wie Primärschlüssel in der URL vorhanden sind:
[ { "title": "Adjusted title for ID 1" }, { "title": "Adjusted title for ID 2" } ]
Dadurch werden die Titel der Beiträge angepasst. Und die Rückgabewerte sind die Anzahl der festgelegten Zeilen:
[1,1]
Das bedeutet, dass es zwei Aktualisierungsvorgänge gab und jeder von ihnen eine Zeile festgelegt hatte. Bei Stapelvorgängen werden Datenbanktransaktionen verwendet, sodass entweder alle erfolgreich sind oder alle fehlschlagen (erfolgreiche Vorgänge werden zurückgesetzt). Wenn sie fehlschlagen, enthält der Hauptteil die Liste der Fehlerdokumente. In der folgenden Antwort war der erste Vorgang erfolgreich und der zweite Vorgang des Stapels ist aufgrund einer Integritätsverletzung fehlgeschlagen:
[ { "code": 0, "message": "Success" }, { "code": 1010, "message": "Data integrity violation" } ]
Der Antwortstatuscode lautet immer 424 (fehlgeschlagene Abhängigkeit), falls einer der Stapelvorgänge fehlschlägt.
Um mehrere Datensätze in diese Tabelle einzufügen, kann die Anfrage im URL-Format wie folgt geschrieben werden:
POST /records/posts
Der Textkörper sollte ein Array von einzufügenden Datensätzen enthalten:
[ { "title": "Hello world!", "content": "Welcome to the first post.", "created": "2018-03-05T20:12:56Z" }, { "title": "Black is the new red", "content": "This is the second post.", "created": "2018-03-06T21:34:01Z" } ]
Der Rückgabewert ist ebenfalls ein Array, das die Primärschlüssel der neu eingefügten Datensätze enthält:
[1,2]
Beachten Sie, dass der Batch-Vorgang für DELETE dem gleichen Muster wie PUT folgt, jedoch ohne Text.
Zur räumlichen Unterstützung gibt es einen zusätzlichen Satz Filter, der auf Geometriespalten angewendet werden kann und mit einem „s“ beginnt:
„sco“: räumlich enthält (Geometrie enthält eine andere)
„scr“: räumliche Kreuze (Geometrie kreuzt eine andere)
„sdi“: räumlich disjunkt (Geometrie ist disjunkt von einer anderen)
„seq“: räumlich gleich (Geometrie ist gleich einer anderen)
„sin“: räumliche Schnittmengen (Geometrie schneidet eine andere)
„sov“: räumliche Überlappungen (Geometrie überlappt eine andere)
„sto“: räumliche Berührungen (Geometrie berührt eine andere)
„swi“: räumlich innerhalb (Geometrie ist innerhalb einer anderen)
„sic“: räumlich ist geschlossen (Geometrie ist geschlossen und einfach)
„sis“: räumlich ist einfach (Geometrie ist einfach)
„siv“: räumlich ist gültig (Geometrie ist gültig)
Diese Filter basieren auf OGC-Standards, ebenso wie die WKT-Spezifikation, in der die Geometriespalten dargestellt werden. Beachten Sie, dass die SRID, die bei der Konvertierung von WKT in Geometrie angenommen wird, durch die Konfigurationsvariable geometrySrid
angegeben wird und standardmäßig 4326 (WGS 84) ist.
Die GeoJSON-Unterstützung ist eine schreibgeschützte Ansicht der Tabellen und Datensätze im GeoJSON-Format. Diese Anfragen werden unterstützt:
method path - operation - description ---------------------------------------------------------------------------------------- GET /geojson/{table} - list - lists records as a GeoJSON FeatureCollection GET /geojson/{table}/{id} - read - reads a record by primary key as a GeoJSON Feature
Der Endpunkt „ /geojson
“ verwendet intern den Endpunkt „ /records
“ und erbt alle Funktionen, wie z. B. Verknüpfungen und Filter. Es unterstützt auch einen „Geometrie“-Parameter, um den Namen der Geometriespalte anzugeben, falls die Tabelle mehr als eine hat. Für Kartenansichten wird der Parameter „bbox“ unterstützt, in dem Sie die Koordinaten oben links und unten rechts angeben können (durch Kommas getrennt). Die folgenden Geometrietypen werden von der GeoJSON-Implementierung unterstützt:
Punkt
MultiPoint
LineString
MultiLineString
Polygon
MultiPolygon
Die GeoJSON-Funktionalität ist standardmäßig aktiviert, kann jedoch über die Konfiguration „Controller“ deaktiviert werden.
Um die Erstellung einer API für (einen Teil) eines Legacy-Systems (z. B. Wordpress) zu unterstützen, möchten Sie möglicherweise die Tabellen- und Spaltennamen zuordnen, da diese ohne Änderung der Software nicht verbessert werden können, während die Namen aus Konsistenzgründen möglicherweise verbessert werden müssen. Mit der Konfiguration können Sie Tabellen und Spalten mit einer durch Kommas getrennten Liste von Zuordnungen umbenennen, die durch ein Gleichheitszeichen getrennt sind, wie folgt:
'mapping' => 'wp_posts=posts,wp_posts.ID=posts.id',
In diesem speziellen Beispiel wird die Tabelle „ wp_posts
“ an einem „ posts
“-Endpunkt (anstelle von „ wp_posts
“) und die Spalte „ ID
“ in dieser Tabelle als Eigenschaft „ id
“ (in Kleinbuchstaben statt in Großbuchstaben) verfügbar gemacht.
Hinweis: Da sich diese beiden Zuordnungen überschneiden, kann die erste (weniger spezifische) Zuordnung weggelassen werden.
Sie können die folgende Middleware mit dem Konfigurationsparameter „middlewares“ aktivieren:
„Firewall“: Beschränken Sie den Zugriff auf bestimmte IP-Adressen
„sslRedirect“: Verbindung über HTTPS statt HTTP erzwingen
„cors“: Unterstützung für CORS-Anfragen (standardmäßig aktiviert)
„xsrf“: XSRF-Angriffe mit der Methode „Double Submit Cookie“ blockieren
„ajaxOnly“: Beschränken Sie Nicht-AJAX-Anfragen, um XSRF-Angriffe zu verhindern
„apiKeyAuth“: Unterstützung für „API Key Authentication“
„apiKeyDbAuth“: Unterstützung für „API Key Database Authentication“
„dbAuth“: Unterstützung für „Datenbankauthentifizierung“
„wpAuth“: Unterstützung für „Wordpress-Authentifizierung“
„jwtAuth“: Unterstützung für „JWT-Authentifizierung“
„basicAuth“: Unterstützung für „Basic Authentication“
„reconnect“: Mit anderen Parametern erneut eine Verbindung zur Datenbank herstellen
„Autorisierung“: Beschränken Sie den Zugriff auf bestimmte Tabellen oder Spalten
„Validierung“: Gibt Eingabevalidierungsfehler für benutzerdefinierte Regeln und Standardtypregeln zurück
„ipAddress“: Füllen Sie beim Erstellen ein geschütztes Feld mit der IP-Adresse
„sanitation“: Eingabebereinigung beim Erstellen und Aktualisieren anwenden
„multiTenancy“: Beschränkt den Mandantenzugriff in einem Szenario mit mehreren Mandanten
„pageLimits“: Schränkt Listenvorgänge ein, um Datenbank-Scraping zu verhindern
„joinLimits“: Beschränkt Join-Parameter, um Datenbank-Scraping zu verhindern
„textSearch“: Suche in allen Textfeldern mit einem einfachen Parameter
„Anpassung“: Stellt Handler für die Anpassung von Anforderungen und Antworten bereit
„json“: Unterstützt das Lesen/Schreiben von JSON-Strings als JSON-Objekte/Arrays
„xml“: Übersetzt alle Ein- und Ausgaben von JSON in XML
Der Konfigurationsparameter „middlewares“ ist eine durch Kommas getrennte Liste aktivierter Middlewares. Sie können das Middleware-Verhalten mithilfe von Middleware-spezifischen Konfigurationsparametern optimieren:
„firewall.reverseProxy“: Wird auf „true“ gesetzt, wenn ein Reverse-Proxy verwendet wird („“)
„firewall.allowedIpAddresses“: Liste der IP-Adressen, die eine Verbindung herstellen dürfen („“)
„cors.allowedOrigins“: Die in den CORS-Headern zulässigen Ursprünge („*“)
„cors.allowHeaders“: Die in der CORS-Anfrage zulässigen Header („Content-Type, X-XSRF-TOKEN, X-Authorization“)
„cors.allowMethods“: Die in der CORS-Anfrage zulässigen Methoden („OPTIONS, GET, PUT, POST, DELETE, PATCH“)
„cors.allowCredentials“: Um Anmeldeinformationen in der CORS-Anfrage zuzulassen („true“)
„cors.exposeHeaders“: Whitelist-Header, auf die Browser zugreifen dürfen („“)
„cors.maxAge“: Die Zeit, die die CORS-Gewährung gültig ist, in Sekunden („1728000“)
„xsrf.excludeMethods“: Die Methoden, die keinen XSRF-Schutz erfordern („OPTIONS,GET“)
„xsrf.cookieName“: Der Name des XSRF-Schutzcookies („XSRF-TOKEN“)
„xsrf.headerName“: Der Name des XSRF-Schutzheaders („X-XSRF-TOKEN“)
„ajaxOnly.excludeMethods“: Die Methoden, die kein AJAX erfordern („OPTIONS,GET“)
„ajaxOnly.headerName“: Der Name des erforderlichen Headers („X-Requested-With“)
„ajaxOnly.headerValue“: Der Wert des erforderlichen Headers („XMLHttpRequest“)
„apiKeyAuth.mode“: Auf „optional“ setzen, wenn Sie anonymen Zugriff zulassen möchten („erforderlich“)
„apiKeyAuth.header“: Der Name des API-Schlüsselheaders („X-API-Key“)
„apiKeyAuth.keys“: Liste der gültigen API-Schlüssel („“)
„apiKeyDbAuth.mode“: Auf „optional“ setzen, wenn Sie anonymen Zugriff zulassen möchten („erforderlich“)
„apiKeyDbAuth.header“: Der Name des API-Schlüsselheaders („X-API-Key“)
„apiKeyDbAuth.usersTable“: Die Tabelle, in der die Benutzer gespeichert werden („users“)
„apiKeyDbAuth.apiKeyColumn“: Die Benutzertabellenspalte, die den API-Schlüssel („api_key“) enthält.
„dbAuth.mode“: Auf „optional“ setzen, wenn Sie anonymen Zugriff zulassen möchten („erforderlich“)
„dbAuth.usersTable“: Die Tabelle, in der die Benutzer gespeichert werden („users“)
„dbAuth.loginTable“: Die Tabelle oder Ansicht, die zum Abrufen der Benutzerinformationen für die Anmeldung („Benutzer“) verwendet wird.
„dbAuth.usernameColumn“: Die Benutzertabellenspalte, die Benutzernamen („Benutzername“) enthält.
„dbAuth.passwordColumn“: Die Benutzertabellenspalte, die Passwörter („password“) enthält.
„dbAuth.returnedColumns“: Die bei erfolgreicher Anmeldung zurückgegebenen Spalten, leer bedeutet „alle“ („“)
„dbAuth.usernameFormField“: Der Name des Formularfelds, das den Benutzernamen („Benutzername“) enthält.
„dbAuth.passwordFormField“: Der Name des Formularfelds, das das Passwort („password“) enthält
„dbAuth.newPasswordFormField“: Der Name des Formularfelds, das das neue Passwort enthält („newPassword“)
„dbAuth.registerUser“: JSON-Benutzerdaten (oder „1“), falls Sie den Endpunkt /register aktivieren möchten („“)
„dbAuth.loginAfterRegistration“: 1 oder Null, wenn registrierte Benutzer nach der Registrierung angemeldet werden sollen („“)
„dbAuth.passwordLength“: Mindestlänge, die das Passwort haben muss („12“)
„dbAuth.sessionName“: Der Name der PHP-Sitzung, die gestartet wird („“)
„wpAuth.mode“: Auf „optional“ setzen, wenn Sie anonymen Zugriff zulassen möchten („erforderlich“)
„wpAuth.wpDirectory“: Der Ordner/Pfad, in dem die Wordpress-Installation zu finden ist („“.“)
„wpAuth.usernameFormField“: Der Name des Formularfelds, das den Benutzernamen („Benutzername“) enthält.
„wpAuth.passwordFormField“: Der Name des Formularfelds, das das Passwort („password“) enthält
„jwtAuth.mode“: Auf „optional“ setzen, wenn Sie anonymen Zugriff zulassen möchten („erforderlich“)
„jwtAuth.header“: Name des Headers, der das JWT-Token („X-Authorization“) enthält
„jwtAuth.leeway“: Die akzeptable Anzahl der Sekunden des Taktversatzes („5“)
„jwtAuth.ttl“: Die Anzahl der Sekunden, die das Token gültig ist („30“)
„jwtAuth.secrets“: Die gemeinsamen Geheimnisse, die zum Signieren des JWT-Tokens mit („“) verwendet werden.
„jwtAuth.algorithms“: Die zulässigen Algorithmen, leer bedeutet „alle“ („“)
„jwtAuth.audiences“: Die zulässigen Zielgruppen, leer bedeutet „alle“ („“)
„jwtAuth.issuers“: Die zulässigen Aussteller, leer bedeutet „alle“ („“)
„jwtAuth.sessionName“: Der Name der PHP-Sitzung, die gestartet wird („“)
„basicAuth.mode“: Auf „optional“ setzen, wenn Sie anonymen Zugriff zulassen möchten („erforderlich“)
„basicAuth.realm“: Text zur Eingabeaufforderung beim Anzeigen der Anmeldung („Benutzername und Passwort erforderlich“)
„basicAuth.passwordFile“: Die Datei, die für Benutzername/Passwort-Kombinationen gelesen werden soll („.htpasswd“)
„basicAuth.sessionName“: Der Name der PHP-Sitzung, die gestartet wird („“)
„reconnect.driverHandler“: Handler zum Implementieren des Abrufs des Datenbanktreibers („“)
„reconnect.addressHandler“: Handler zum Implementieren des Abrufs der Datenbankadresse („“)
„reconnect.portHandler“: Handler zum Implementieren des Abrufs des Datenbankports („“)
„reconnect.databaseHandler“: Handler zum Implementieren des Abrufs des Datenbanknamens („“)
„reconnect.tablesHandler“: Handler zum Implementieren des Abrufs der Tabellennamen („“)
„reconnect.mappingHandler“: Handler zum Implementieren des Abrufs der Namenszuordnung („“)
„reconnect.usernameHandler“: Handler zum Implementieren des Abrufs des Datenbankbenutzernamens („“)
„reconnect.passwordHandler“: Handler zum Implementieren des Abrufs des Datenbankpassworts („“)
„authorization.tableHandler“: Handler zum Implementieren von Tabellenautorisierungsregeln („“)
„authorization.columnHandler“: Handler zum Implementieren von Spaltenautorisierungsregeln („“)
„authorization.pathHandler“: Handler zum Implementieren von Pfadautorisierungsregeln („“)
„authorization.recordHandler“: Handler zum Implementieren von Datensatzautorisierungsfilterregeln („“)
„validation.handler“: Handler zum Implementieren von Validierungsregeln für Eingabewerte („“)
„validation.types“: Typen, für die die Typvalidierung aktiviert werden soll, leer bedeutet „keine“ („alle“)
„validation.tables“: Tabellen, für die die Typvalidierung aktiviert werden soll, leer bedeutet „keine“ („alle“)
„ipAddress.tables“: Tabellen zum Suchen nach Spalten, die mit der IP-Adresse („“) überschrieben werden sollen
„ipAddress.columns“: Spalten, die beim Erstellen geschützt und mit der IP-Adresse überschrieben werden sollen („“)
„sanitation.handler“: Handler zum Implementieren von Hygieneregeln für Eingabewerte („“)
„sanitation.types“: Typen, für die Typbereinigung aktiviert werden soll, leer bedeutet „keine“ („alle“)
„sanitation.tables“: Tabellen, für die die Typbereinigung aktiviert werden soll, leer bedeutet „keine“ („alle“)
„multiTenancy.handler“: Handler zur Implementierung einfacher Mandantenfähigkeitsregeln („“)
„pageLimits.pages“: Die maximale Seitenzahl, die eine Listenoperation zulässt („100“)
„pageLimits.records“: Die maximale Anzahl der von einer Listenoperation zurückgegebenen Datensätze („1000“)
„joinLimits. Depth“: Die maximale Tiefe (Länge), die in einem Join-Pfad zulässig ist („3“)
„joinLimits.tables“: Die maximale Anzahl an Tabellen, denen Sie beitreten dürfen („10“)
„joinLimits.records“: Die maximale Anzahl der für eine verbundene Entität zurückgegebenen Datensätze („1000“)
„textSearch.parameter“: Der Name des für den Suchbegriff verwendeten Parameters („search“)
„customization.beforeHandler“: Handler zum Implementieren der Anforderungsanpassung („“)
„customization.afterHandler“: Handler zum Implementieren der Antwortanpassung („“)
„json.controllers“: Controller zur Verarbeitung von JSON-Strings für („records,geojson“)
„json.tables“: Tabellen zur Verarbeitung von JSON-Strings für („all“)
„json.columns“: Spalten, für die JSON-Strings verarbeitet werden sollen („all“)
„xml.types“: JSON-Typen, die dem XML-Typattribut hinzugefügt werden sollen („null,array“)
Wenn Sie diese Parameter nicht in der Konfiguration angeben, werden die Standardwerte (in Klammern) verwendet.
In den folgenden Abschnitten finden Sie weitere Informationen zur integrierten Middleware.
Derzeit werden fünf Arten der Authentifizierung unterstützt. Sie alle speichern den authentifizierten Benutzer im Superglobal $_SESSION
. Diese Variable kann in den Berechtigungshandlern verwendet werden, um zu entscheiden, ob jemand Lese- oder Schreibzugriff auf bestimmte Tabellen, Spalten oder Datensätze haben soll oder nicht. Die folgende Übersicht zeigt die Arten von Authentifizierungs-Middleware, die Sie aktivieren können.
Name | Middleware | Authentifiziert über | Benutzer werden in gespeichert | Sitzungsvariable |
---|---|---|---|---|
API-Schlüssel | apiKeyAuth | Header „X-API-Key“. | Konfiguration | $_SESSION['apiKey'] |
API-Schlüssel-DB | apiKeyDbAuth | Header „X-API-Key“. | Datenbanktabelle | $_SESSION['apiUser'] |
Datenbank | dbAuth | '/login'-Endpunkt | Datenbanktabelle | $_SESSION['user'] |
Basic | basicAuth | Header „Autorisierung“. | '.htpasswd'-Datei | $_SESSION['username'] |
JWT | jwtAuth | Header „Autorisierung“. | Identitätsanbieter | $_SESSION['claims'] |
Nachfolgend finden Sie weitere Informationen zu den einzelnen Authentifizierungsarten.
Die API-Schlüsselauthentifizierung funktioniert durch das Senden eines API-Schlüssels in einem Anforderungsheader. Der Header-Name ist standardmäßig „X-API-Key“ und kann mit dem Konfigurationsparameter „apiKeyAuth.header“ konfiguriert werden. Gültige API-Schlüssel müssen mit dem Konfigurationsparameter „apiKeyAuth.keys“ (durch Kommas getrennte Liste) konfiguriert werden.
X-API-Key: 02c042aa-c3c2-4d11-9dae-1a6e230ea95e
Der authentifizierte API-Schlüssel wird in der Variablen $_SESSION['apiKey']
gespeichert.
Beachten Sie, dass für die API-Schlüsselauthentifizierung keine Sitzungscookies erforderlich sind oder verwendet werden.
Die API-Schlüsseldatenbankauthentifizierung funktioniert durch Senden eines API-Schlüssels in einem Anforderungsheader „X-API-Key“ (der Name ist konfigurierbar). Gültige API-Schlüssel werden aus der Datenbank aus der Spalte „api_key“ der Tabelle „users“ gelesen (beide Namen sind konfigurierbar).
X-API-Key: 02c042aa-c3c2-4d11-9dae-1a6e230ea95e
Der authentifizierte Benutzer (mit allen seinen Eigenschaften) wird in der Variablen $_SESSION['apiUser']
gespeichert.
Beachten Sie, dass für die Authentifizierung der API-Schlüsseldatenbank keine Sitzungscookies erforderlich sind oder verwendet werden.
Die Datenbankauthentifizierungs-Middleware definiert fünf neue Routen:
method path - parameters - description --------------------------------------------------------------------------------------------------- GET /me - - returns the user that is currently logged in POST /register - username, password - adds a user with given username and password POST /login - username, password - logs a user in by username and password POST /password - username, password, newPassword - updates the password of the logged in user POST /logout - - logs out the currently logged in user
Ein Benutzer kann angemeldet werden, indem er seinen Benutzernamen und sein Passwort an den Anmeldeendpunkt sendet (im JSON-Format). Der authentifizierte Benutzer (mit allen seinen Eigenschaften) wird in der Variablen $_SESSION['user']
gespeichert. Der Benutzer kann abgemeldet werden, indem eine POST-Anfrage mit einem leeren Textkörper an den Abmeldeendpunkt gesendet wird. Die Passwörter werden als Hashes in der Passwortspalte der Benutzertabelle gespeichert. Sie können einen neuen Benutzer über den Registerendpunkt registrieren, diese Funktionalität muss jedoch mit dem Konfigurationsparameter „dbAuth.registerUser“ aktiviert werden.
Es ist WICHTIG, den Zugriff auf die Benutzertabelle mithilfe der „Autorisierungs“-Middleware einzuschränken, da sonst alle Benutzer jedes Konto frei hinzufügen, ändern oder löschen können! Die minimale Konfiguration ist unten dargestellt:
'middlewares' => 'dbAuth,authorization', 'authorization.tableHandler' => function ($operation, $tableName) { return $tableName != 'users'; },
Beachten Sie, dass diese Middleware Sitzungscookies verwendet und den Anmeldestatus auf dem Server speichert.
Melden Sie sich über Ansichten mit verknüpfter Tabelle an
Für Anmeldevorgänge ist es möglich, eine Ansicht als Benutzertabelle zu verwenden. Eine solche Ansicht kann ein gefiltertes Ergebnis aus der Benutzertabelle zurückgeben, z. B. wenn aktiv = wahr ist , oder sie kann auch ein Ergebnis mehrerer Tabellen über eine Tabellenverknüpfung zurückgeben. Die Ansicht sollte mindestens den Benutzernamen und das Passwort sowie ein Feld mit dem Namen id enthalten.
Ansichten mit verbundenen Tabellen können jedoch nicht eingefügt werden (siehe Problem 907). Um dieses Problem zu umgehen, verwenden Sie die Eigenschaft loginTable , um eine andere Referenztabelle für die Anmeldung festzulegen. Die „usersTable“ wird weiterhin auf die normale, einfügbare Benutzertabelle gesetzt.
Die Wordpress-Authentifizierungs-Middleware definiert drei Routen:
method path - parameters - description --------------------------------------------------------------------------------------------------- GET /me - - returns the user that is currently logged in POST /login - username, password - logs a user in by username and password POST /logout - - logs out the currently logged in user
Ein Benutzer kann angemeldet werden, indem er seinen Benutzernamen und sein Passwort an den Anmeldeendpunkt sendet (im JSON-Format). Der Benutzer kann abgemeldet werden, indem eine POST-Anfrage mit einem leeren Textkörper an den Abmeldeendpunkt gesendet wird. Sie müssen das WordPress-Installationsverzeichnis mit dem Konfigurationsparameter „wpAuth.wpDirectory“ angeben. Die Middleware ruft „wp-load.php“ auf. Dadurch können Sie Wordpress-Funktionen in der Autorisierungs-Middleware verwenden, wie zum Beispiel:
wp_get_current_user()
is_user_logged_in()
is_super_admin()
user_can(wp_get_current_user(),'edit_posts');
Beachten Sie, dass die Variable $_SESSION
von dieser Middleware nicht verwendet wird.
Der Basic-Typ unterstützt eine Datei (standardmäßig „.htpasswd“), die die Benutzer und ihre (gehashten) Passwörter enthält, getrennt durch einen Doppelpunkt („:“). Wenn die Passwörter im Klartext eingegeben werden, werden sie automatisch gehasht. Der authentifizierte Benutzername wird in der Variablen $_SESSION['username']
gespeichert. Sie müssen nach dem Wort „Basic“ einen „Authorization“-Header senden, der eine Base64-URL-codierte Version Ihres durch Doppelpunkte getrennten Benutzernamens und Passworts enthält.
Authorization: Basic dXNlcm5hbWUxOnBhc3N3b3JkMQ
In diesem Beispiel wird die Zeichenfolge „Benutzername1:Passwort1“ gesendet.
Der JWT-Typ erfordert, dass ein anderer (SSO/Identitäts-)Server ein Token signiert, das Ansprüche enthält. Beide Server teilen ein Geheimnis, sodass sie entweder signieren oder überprüfen können, ob die Signatur gültig ist. Ansprüche werden in der Variablen $_SESSION['claims']
gespeichert. Sie müssen einen „X-Authorization“-Header senden, der einen Base64-URL-codierten und durch Punkte getrennten Token-Header, Text und Signatur nach dem Wort „Bearer“ enthält (lesen Sie hier mehr über JWT). Der Standard besagt, dass Sie den Header „Authorization“ verwenden müssen, aber das ist in Apache und PHP problematisch.
X-Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6IjE1MzgyMDc2MDUiLCJleHAiOjE1MzgyMDc2MzV9.Z5px_GT15TRKhJCTHhDt5Z6K6LRDSFnLj8U5ok9l7gw
In diesem Beispiel werden die signierten Ansprüche gesendet:
{ "sub": "1234567890", "name": "John Doe", "admin": true, "iat": "1538207605", "exp": 1538207635 }
Hinweis: Die JWT-Implementierung unterstützt nur die RSA- und HMAC-basierten Algorithmen.