In der heutigen digitalen Welt ist eine reibungslose und intuitive Benutzererfahrung der Schlüssel zum Erfolg jeder Webanwendung. Ein entscheidender Teil dieses Erlebnisses besteht darin, den Benutzern einen einfachen Zugang zu verschiedenen Ressourcen zu ermöglichen – seien es Dokumente, Bilder oder andere Datentypen. Um dies zu ermöglichen, muss Ihr Server verschiedene Content-Formate effizient verwalten und bereitstellen.
Mit der neuen REST-Server-Funktion von 4D ist die Verwaltung verschiedener Inhalte jetzt einfacher denn je. Bisher konnte der REST-Server nur Skalar-, Entitäts- oder Entitätsauswahldaten zurückliefern. Jetzt kann er direkt vollständige Webinhalte liefern – Inhalte, die ein Browser verarbeiten kann.
Das Herunterladen von Dateien oder der Empfang von Binärdaten vom REST-Server ist jetzt dank der neuen Klasse OutgoingMessage ganz einfach. Mit ihr können Sie die Antworten leicht an Ihre Bedürfnisse anpassen.
Lesen Sie weiter, um zu erfahren, wie die OutgoingMessage-Klasse Ihre Anwendung verbessern kann!
Aufruf einer exponierten Funktion auf dem REST-Server
Kurze Erinnerung: ORDA-Datenmodellfunktionen und Singleton-Funktionen sind als REST-APIs aufrufbar. Um Ihr Gedächtnis aufzufrischen, lesen Sie diesen Blogbeitrag und diesen.
Bisher konnte der REST-Server verschiedene Ergebnistypen – Skalare, Entitäten oder Entitätsauswahlen – innerhalb eines Objekts zurückgeben, das die Eigenschaft result verwendet.
Beispiel
Dies ist die Funktion getSomeInfo() für die Klasse Datastore.
exposed Function getSomeInfo() : Text
return "This is the info"
Und hier ist das Ergebnis, wenn sie mit der Anfrage /rest/$catalog/getSomeInfo aufgerufen wird:
{
"result": "This is the info"
}
4D Web Befehle können in solchen Funktionen nicht verwendet werden, daher ist die neue OutgoingMessage Klasse einen großen Vorteil mit sich bringt.
Die neue OutgoingMessage Klasse
Die ORDA-Datenmodell- und Singletons-Funktionen können nun eine Objektinstanz dieser neuen OutgoingMessage Klasse zurückgeben.
Solche Objekte werden von jedem Browser direkt als Webinhalt behandelt.
So können Sie Ihren Endbenutzern Funktionen wie das Herunterladen von Dateien und Bildern und den Empfang beliebiger Inhaltstypen über einen Browser vorschlagen.
Dies ist die JSON-Darstellung einer solchen Objektinstanz der OutgoingMessage Klasse.
Beispiel
In diesem Beispiel wird die Funktion getFile() in der Klasse Datastore implementiert. Der Zweck ist die Rückgabe der Datei testFile.pdf als Antwort auf die Anfrage.
Es wird eine Objektinstanz der OutgoingMessage Klasse wird erzeugt.
Der Body enthält den binären Inhalt der Datei testFile.pdf und eine Kopfzeile, die angibt, dass der Inhaltstyp festgelegt ist.
exposed onHTTPGet Function getFile() : 4D.OutgoingMessage
var $result:=4D.OutgoingMessage.new()
var $file:=File("/RESOURCES/testFile.pdf")
$result.setBody($file.getContent()) // This is binary content
$result.setHeader("Content-Type"; "application/pdf")
return $result
Die Klasse OutgoingMessage Klasse enthält drei Eigenschaften, die Sie je nach Bedarf füllen können:
-
- header: Setzen Sie einen beliebigen HTTP-Header, den der Client verarbeiten muss(z. B. content-type, um den Typ des Body-Inhalts anzugeben)
-
- body: Legen Sie den Inhalt fest, den Sie als Antwort auf die Anfrage senden möchten. Es kann ein String oder ein Blob sein(z. B. eine Datei, ein Dokument oder ein Bild als binärer Inhalt).
-
- Status: Setzen Sie einen beliebigen HTTP-Statuscode entsprechend dem Ergebnis der erfolgten Anfrage. Dadurch erhält der Client Informationen darüber, wie die Anfrage verlaufen ist (z. B. Status 403, wenn die Anfrage abgelehnt wurde). Der Standardwert ist 200.
N.B. Die Eigenschaften body und status können mit dem Operator := oder mit dem entsprechenden setBody() / setStatus() Funktion beeinflusst werden.
Erleichterung des Aufrufs von Funktionen auf dem Restserver
das neue onHTTPGet-Schlüsselwort für Funktionen
Bislang mussten die Funktionsaufrufe (von ORDA-Datenmodellklassen und Singletons) über den REST-Server mit einem POST-Verb erfolgen. Dies geschah aus Sicherheitsgründen, um zu vermeiden, dass sensibler Code durch eine so einfache Aktion wie das Klicken auf einen Link ausgeführt wird.
Da POST nicht immer der gewünschten Benutzererfahrung entspricht, können diese Funktionen auch mit einem GET-Verb aufgerufen werden, d . h. durch Eingabe einer URL in einem Browser.
Verwenden Sie dazu das neue onHTTPGet Schlüsselwort für diese Funktion. Wenn dieses Schlüsselwort auf eine Funktion angewendet wird, ist diese Funktion auch mit einem GET-Verb aufrufbar!
Beispiel
exposed onHTTPGet Function getSomeInfo() : 4D.OutgoingMessage
N.B. Da diese Art des Aufrufs eine leicht angebotene Aktion ist, muss der Entwickler sicherstellen, dass in solchen Funktionen keine sensiblen Aktionen durchgeführt werden.
Übergabe von Parametern
Parameter können mit dem Parameter $params an die Funktion übergeben werden (muss in eine Sammlung eingeschlossen sein).
Beispiel
In diesem Beispiel wird die Funktion getThumbnail() der Datenklasse Products aufgerufen (um ein Miniaturfoto eines bestimmten Produkts zu erhalten).
Sie erhält den Produktnamen und die erforderliche Breite und Länge.
IP:port/rest/Products/getThumbnail?$params='["Yellow Pack",200,200]'
Weitere Informationen zur Übergabe von Parametern beim Aufruf einer Funktion finden Sie in der Dokumentation.
Ein vollständiges Beispiel
Hier ist der Anwendungsfall dieses Beispiels: Einem Endbenutzer wird ein Link zum Herunterladen des Benutzerhandbuchs eines ausgewählten Produkts vorgeschlagen, wobei mehrere Formate verfügbar sind.
Die Anfrage hinter dem Link lautet: IP:port/rest/Products/getUserManual?$params='[1, „pdf“]‘
Die ausgewählte Produkt-ID (1) wird als Parameter übergeben und das gewünschte Format (pdf).
Die Funktion getUserManual() der Datenklasse Products wird aufgerufen. Sie erhält die Produkt-ID und das Format als Parameter.
Das entsprechende Dokument wird abgerufen. Sein binärer Inhalt wird als Body in die Antwort mit dem entsprechenden Inhaltstyp eingefügt.
exposed onHTTPGet Function getUserManual($productId : Integer; $type : Text) : 4D.OutgoingMessage
var $file : 4D.File
var $response:=4D.OutgoingMessage.new()
var $doc:="/RESOURCES/User manuals/product_"+String($productId)
Case of
: ($type="pdf")
$file:=File($doc+".pdf")
$response.setBody($file.getContent()) // This is binary content
$response.setHeader("Content-Type"; "application/pdf")
: ($type="jpeg")
$file:=File($doc+".jpeg")
$response.setBody($file.getContent()) // This is binary content
$response.setHeader("Content-Type"; "image/jpeg")
End case
return $response
Hier ist das Szenario in einem Browser wiedergegeben:
Probieren Sie es selbst aus
Laden Sie den HDI herunter, um diese neue Funktion zu erforschen, und lesen Sie die Dokumentation, um weitere Einzelheiten über die Verwendung der OutgoingMessage Klasse in Ihren Webanwendungen.