expservices: entfernte Dienste für Erweiterungen
Teil 8, Referenz 33. expservices ist eine mit dem Kernel ausgelieferte Erweiterung, die die Funktionen der
Installation als Dienste über ezjscore anbietet: eine Klasse je Bereich (System, Caches, Einstellungen, Benutzer,
Inhalte ...), aufgerufen als <root>/ezjscore/call/exp<domain>::<method>, mit der Antwort in einem einheitlichen
JSON-Umschlag. Apps, Skripte und andere Server verwenden sie; eine Erweiterung kann einen eigenen Bereich hinzufügen.
Die vollständige Dokumentation ist Backend-Dienste über ezjscore.
Was Sie gegenüber einer einfachen Serverfunktion gewinnen
| Einfache ezjscore-Serverfunktion | expservices-Dienst | |
|---|---|---|
| Deklaration | eine öffentliche statische Methode | die Methode plus ein Eintrag in static::$services (summary, access, write, args, returns) |
| Zugriff | von Ihrem Code geprüft | deklariert, von guard() geprüft |
| Schreibzugriffe | Ihr Code prüft POST und das Token | 'write' => true: POST und Formular-Token erforderlich, im Audit-Log erfasst |
| Fehler | error_text | { "ok": false, "error": { "code": 403, "message": ... } } mit Codes nach HTTP-Art |
| Listen | Ihr eigenes Format | seitenweise: data plus meta (total, offset, limit, count, has_more) |
| Auffindbarkeit | keine | expservices::catalog listet jeden Dienst mit seiner Deklaration |
| Clients außerhalb des Browsers | das Sitzungs-Cookie | zusätzlich persönliche API-Tokens (Header X-Exp-Token) |
Einen Dienst schreiben
Nach dem Beispiel der Dokumentation, mit Ihrem Bereich:
class expMyExtServices extends expServiceBase
{
public static $services = array(
'itemName' => array( 'summary' => 'The name of one item',
'access' => array( 'myext', 'read' ), 'write' => false,
'args' => array( 'item_id' => 'int' ), 'returns' => 'id, name' ),
);
public static function itemName( $args )
{
self::guard( __FUNCTION__ );
$item = myExtItem::fetch( self::arg( $args, 0, 'int' ) );
if ( !$item )
{
throw new expServiceException( 'No such item', 404 );
}
return self::ok( array( 'id' => (int)$item->attribute( 'id' ), 'name' => $item->attribute( 'name' ) ) );
}
}Registrieren Sie ihn in settings/ezjscore.ini.append.php Ihrer Erweiterung:
[ezjscServer_expmyext]
Class=expMyExtServicesund erzeugen Sie die Autoloads neu. Aufgerufen wird er als <root>/ezjscore/call/expmyext::itemName::42.
| Hilfsmethode (protected static) | Verwendung |
|---|---|
guard( $method ) | den deklarierten Zugriff prüfen, bei Schreibzugriffen auch POST und Token |
arg( $args, $i, $type, $default = null ) | ein typisiertes URL-Argument |
post( $name, $type, $default = null ) | ein typisiertes POST-Feld |
ok( $data, array $meta = array() ) | der Umschlag für den Erfolgsfall |
page( array $items, $total, $offset, $limit ), pageOf( ... ) | eine seitenweise Liste |
Codes von expServiceException: 400 (Argumente), 401 (Anmeldung nötig), 403 (verweigert), 404 (nicht gefunden),
409 (Konflikt), 422 (ungültig).
Sicherheit
- Jeder Dienst deklariert seinen Zugriff;
'public'nur für das, was anonyme Besucher wissen dürfen. - Schreibzugriffe erfolgen per POST mit dem Formular-Token oder mit einem API-Token und werden im Audit-Log festgehalten.
- Die ezjscore-Richtlinie
ezjscore/callgilt weiterhin (Referenz der ezjscore-Serverfunktionen). - Geben Sie nie Passwörter, Tokens oder personenbezogene Daten zurück, die ein Aufrufer nicht braucht.
Demomodus. Im Demomodus (EXP_DEMO_MODE=1) verweigern die Passwortmethoden Administratoren:
requireAcceptablePassword() wirft HTTP 403 mit expDemoMode::refusalText(), und expaccount.forgotRequest erzeugt
für einen Administrator keinen Schlüssel. Ein eigener Dienst, der Passwörter ändert, sollte zuerst
expDemoMode::protectsPassword() fragen. Demomodus für Entwickler.
Verwandte Seiten
- Zurück: Das Hilfesystem für Erweiterungen
- Weiter: Glossar für Erweiterungsentwickler
- Backend-Dienste über ezjscore
- API-Schlüssel
- Freie Dokumentation: Diese Seite darf unter der GNU FDL 1.3 frei kopiert, übersetzt und verbessert werden.
Werden Sie Exponential-Partner
Partner teilen ihre Informationen, stellen Mittel bereit, geben Beiträge zurück und entwickeln die Produkte mit uns, und so wächst Exponential. Eine Partner-Website und ein Dashboard sind für Mitte 2027 geplant: Werden Sie noch heute Partner, damit wir schneller wachsen und neue Funktionen früher liefern.