Serialisierung¶
In der REST API muss an verschiedenen Stellen Inhalt von und nach JSON serialisiert und deserialisiert werden.
Grundsätzlich ist das Format für die Serialisierung (Lesen von der API) dasselbe wie für die Deserialisierung (Schreiben via API).
Primitive Typen¶
Primitive Datentypen, welche eine entsprechende Repräsentation in JSON haben, wie z.B. Integers oder Strings, werden direkt zwischen Python und JSON übersetzt. Ein Python string aus GEVER wird also als JSON-String ausgegeben, und umkekehrt.
Datum / Zeit¶
Da JSON keinen nativen Support für datetimes bietet, werden Python/Zope datetimes zu ISO 8601 Strings serialisiert. Als Zeitzone wird bei der Serialisierung immer UTC verwendet, nicht Lokalzeit.
Python | JSON |
---|---|
time(19, 45, 55) |
'19:45:55' |
date(2015, 11, 23) |
'2015-11-23' |
datetime(2015, 11, 23, 19, 45, 55, tzinfo=pytz.timezone('Europe/Zurich')) |
'2015-11-23T18:45:55+00:00' |
DateTime('2018/08/09 13:43:27.261730 GMT+2') |
'2018-08-09T11:43:58+00:00' |
Dateien¶
Download (Serialisierung)¶
Für den Download von Dateien wird ein File-Field zu einem Mapping serialisiert welches die wichtigsten Metadaten zur Datei (nicht zum Dokument), und einen Download-Link für das Herunterladen enthält:
{
"@id": "http://example.org/dossier/mydoc",
"@type": "opengever.document.document",
"title": "My document",
"...": "",
"file": {
"content-type": "application/pdf",
"download": "http://example.org/dossier/mydoc/@@download/file",
"filename": "file.pdf",
"size": 74429
}
}
Die URL im download
Property zeigt auf die reguläre Download-View von
Plone. Dies bedeutet, dass der Client einen GET
request auf diese URL
durchführen kann, um die Datei herunterzuladen. Jedoch darf hier als
Accept
Header nicht mehr application/json
gesetzt werden (wie sonst
für API-Requests üblich), sondern der MIME-Type der zu herunterladenden
Datei (gemäss dem content-type
Property).
Upload (Deserialisierung)¶
Für Datei-Felder muss der Client die Datei und deren Metadaten als ein Mapping
senden, ähnlich dem Mapping für den Download. Das Mapping muss die Daten der
Datei base64 codiert im data
Property enthalten, und weitere Metadaten in
den übrigen Properties:
data
- der Inhalt der Datei, base64 codiertencoding
- das Encoding das verwendet wurde, alsobase64
content-type
- der MIME-Type der Dateifilename
- der Dateiname, inkl. Dateiendung
{
"@type": "opengever.document.document",
"title": "My file",
"...": "",
"file": {
"data": "TG9yZW0gSXBzdW0uCg==",
"encoding": "base64",
"filename": "lorem.txt",
"content-type": "text/plain"}
}
Verweise¶
Serialisierung¶
Verweise werden zu einer summarischen Repräsentation des referenzierten Objekts serialisiert:
{
"...": "",
"relatedItems": [
{
"@id": "http://example.org/dossier/doc1",
"@type": "opengever.document.document",
"UID": "efb7c240392e49a9a23ba8f51ce0175c",
"title": "Document 1",
"description": "Description"
}
]
}
Die Liste von Verweisen wird zu einer einfachen JSON-Liste serialisiert.
Deserialisierung¶
Um beim Erstellen oder Updaten von Objekten einen Verweis zu setzen, können verschiedene Methoden verwendet werden um das Verweisziel anzugeben. Es kann einer der hier aufgeführten Bezeichner verwendet werden, um das Verweisziel eindeutig zu identifizieren:
Typ | Beispiel |
---|---|
UID | '9b6a4eadb9074dde97d86171bb332ae9' |
IntId | 123456 |
Pfad | '/dossier/doc1' |
URL | 'http://example.org/dossier/doc1' |