MotivationGrundlagen
ImplementierungZusammenfassung
Theorie und Praxis einer JSON-RPC-basiertenWeb-API
Christian [email protected]
Raritan Deutschland GmbH
Chemnitzer LinuxTage 2015
Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API
MotivationGrundlagen
ImplementierungZusammenfassung
Gliederung
1 Motivation
2 GrundlagenRemote Procedure CallInterface Definition LanguageJSON, JSON-RPC und REST
3 ImplementierungSprachanbindungenVersionierung
Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API
MotivationGrundlagen
ImplementierungZusammenfassung
Problemstellung
Entwicklung eines neuen ProduktesPDU - Power Distribution UnitMessen von Strom, Spannung,Energie und LeistungSchalten der AusgängeUnterstützung einer Vielzahl vonSensoren und Aktoren
Gesucht: Netzwerk-APIAbfrage aller Daten, Steuerung,Konfigurationinterne Nutzung (Web-Oberfläche)Skripte für Test, Produktion undInstallationIntegration
Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API
MotivationGrundlagen
ImplementierungZusammenfassung
Anforderungen
Nutzung von existierenden StandardsVerschlüsselung, AuthentifizierungImplementierbarkeit
Eignung für eingebettete SystemeEignung für effiziente IPCEinfache Generierung einer Vielzahl vonSprach-Anbindungen
Wartbarkeit / DebuggingLesbarkeit des „On-Wire“-ProtokollsNutzung mit Standard-Tools
Formale Definition
Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API
MotivationGrundlagen
ImplementierungZusammenfassung
Gewählte Technologien
einfache, objektorientierte IDLJSON-RPCan REST-API angelehntes URI-SchemaHTTP
HTTPS zur VerschlüsselungBasic Auth zur Authentifizierung
Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API
MotivationGrundlagen
ImplementierungZusammenfassung
Remote Procedure CallInterface Definition LanguageJSON, JSON-RPC und REST
Remote Procedure Call - RPC
Aufruf von Funktionenüber Prozess- und Systemgrenzen hinwegClient-/Server-ArchitekturBeispiele
CORBAXML-RPCD-BusSOAP
Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API
MotivationGrundlagen
ImplementierungZusammenfassung
Remote Procedure CallInterface Definition LanguageJSON, JSON-RPC und REST
Interface Definition Language - IDL
Formale Beschreibung einer SchnittstelleStrukturen und EnumerationenKlassen/InterfacesMethoden
Unabhängig von einer ProgrammierspracheNutzung
Erstellung von SprachanbindungenDokumentation
Beispielinterface Outlet extends EDevice {
enumeration PowerState {PS_OFF,PS_ON
};int setPowerState(in PowerState pstate);
};
Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API
MotivationGrundlagen
ImplementierungZusammenfassung
Remote Procedure CallInterface Definition LanguageJSON, JSON-RPC und REST
JavaScript Object Notation - JSON
textbasiertes Datenaustausch-FormatBasis: JavaScript
Datentypenobj = { "string as key" : "a string value",
"some integer" : 31,"some bool" : true,"an undefined value" : null,"an array type" :
[ 1, false, { "key of inner object" : 42 } ]}
Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API
MotivationGrundlagen
ImplementierungZusammenfassung
Remote Procedure CallInterface Definition LanguageJSON, JSON-RPC und REST
JSON-RPC
RPC-ProtokollSerialisierung: JSONClient: Request-Objekt
Methode (String)Parameter (Objekt)ID
Server: Response-ObjektResultat (Objekt) oderFehler (Objekt)ID
Request{ "jsonrpc": "2.0",
"method": "setPowerState","params": {
"pstate": 1},"id": 23 }
Response{ "jsonrpc": "2.0",
"result": {"_ret_": 0
},"id": 23 }
Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API
MotivationGrundlagen
ImplementierungZusammenfassung
Remote Procedure CallInterface Definition LanguageJSON, JSON-RPC und REST
Representational State Transfer - REST
ProgrammierparadigmaURI identifiziert konkrete(s) Resource / ObjektURI beinhaltet keine MethodeninformationBeispiel
http://10.0.42.2/model/pdu/0/inlet/0
Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API
MotivationGrundlagen
ImplementierungZusammenfassung
SprachanbindungenVersionierung
Vorgehensweise
Abbildung der IDL auf entsprechende Klassen undMethoden(De)Serialisierung von/nach JSON-RPCClient: Objekt in Zielsprache agiert als Proxy für entferntesObjektIDL-Compiler
geschrieben in Javaein Backend pro Sprache und Protokoll-MappingC++ (Client und Server), Java (GWT), Java, JavaScript,Perl, Python, Ruby
Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API
MotivationGrundlagen
ImplementierungZusammenfassung
SprachanbindungenVersionierung
System-Überblick
Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API
MotivationGrundlagen
ImplementierungZusammenfassung
SprachanbindungenVersionierung
Beispiel
Abfrage von Daten auf der Kommandozeile$ curl -s -k -d \
’{"jsonrpc":"2.0", \"method":"getReading", \"params":{},"id":411}’ \
http://user:[email protected]/model/pdu/0/inlet/0/activePower
{"jsonrpc": "2.0", "result":{
"_ret_":{"timestamp": 1426690798, "available": true,"status": {"aboveUpperCritical": false, "aboveUpperWarning": false,"belowLowerWarning": false, "belowLowerCritical":false },
"valid": true,"value":690.620033}
}, "id":411}$
Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API
MotivationGrundlagen
ImplementierungZusammenfassung
SprachanbindungenVersionierung
Beispiele 1
IDLinterface Echo {
structure EchoData {int a;string b;
};
int echo(in EchoData datain,out EchoData dataout);
};
Perl$datain = { "a" => 5,
"b" => "Test" };$ret = $intf->echo($datain,\$dataout);print $dataout->{"a"};
Pythondatain = EchoData(5, "Test")(ret, dataout) = intf.echo(datain)
JavaEchoData datain = new EchoData();datain.a = 5;datain.b = "Test";EchoResult r = intf.echo(datain);int rv = r._ret_;int a = r.dataout.a;String b = r.dataout.b;
Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API
MotivationGrundlagen
ImplementierungZusammenfassung
SprachanbindungenVersionierung
Beispiele 2
IDLinterface Echo {
structure EchoData {int a;string b;
};
int echo(in EchoData datain,out EchoData dataout);
};
C++ - Interfacestruct EchoData {
int32_t a;std::string b;
};virtual int echo(int32_t& _ret_,
const EchoData& datain,EchoData& dataout) = 0;
C++ - Server-Implementierungclass EchoImpl: public virtual Echo {... }
int EchoImpl::echo(int32_t& _ret_,const EchoData& datain,EchoData& dataout) {
dataout = datain;_ret_ = 0;return 0;
}
Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API
MotivationGrundlagen
ImplementierungZusammenfassung
SprachanbindungenVersionierung
Versionierung
Schnittstellen ändern sich über die Zeitneue FunktionenKorrekturen
Anforderungengeringe Auswirkungen auf Clients
UnterscheidungKompatible Änderung
Client muss nicht geändert werdenz.B. neues Element in out-Parameter-Struktur
Aufruf-kompatible ÄnderungClient kann alle Methoden der Klasse aufrufenClient kann ggf. mit dem Rückgabe-Objekt nichts anfangen
Inkompatible ÄnderungClient kann einige Methoden nicht aufrufen
Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API
MotivationGrundlagen
ImplementierungZusammenfassung
SprachanbindungenVersionierung
Versionierung 2
Unterstützung mehrerer Versionenvom Servervom Client
GranularitätKomplette APIInterface/KlasseMethode
Benutzung der Versionierung durch ClientsVersionierung ignorieren (kein Aufwand, „best effort“)Unterstützung und Prüfung genau einer Version (wenigAufwand, geringe Kompatibilität)Unterstützung mehrerer Versionen (substantieller Aufwand)
Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API
MotivationGrundlagen
ImplementierungZusammenfassung
Vorführung
Zusammenfassung
VorteileErstellung und Test einer einzigen API auf Server-SeiteUnabhängige Entwicklung von Oberflächen und SkriptenC++, Java (GWT), Java, JavaScript, Perl, Python, Ruby
Praktische AnwendungWeb-Frontend: Java (GWT)Web-Frontend für mobile Geräte: JavaScriptAnbindung an Steuerungssysteme: RubySkripte für Groß-Installationen: Perl, PythonSkripte für Test und Produktion: Python
NachteileEntwicklung von Clients für mehrere Versionen aufwendigBei inkompatiblen Änderungen muss Client geändertwerdenKompatible Änderungen sind zu bevorzugen
Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API
MotivationGrundlagen
ImplementierungZusammenfassung
Vorführung
Vorführung
Praktische Vorführung
Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API
MotivationGrundlagen
ImplementierungZusammenfassung
Vorführung
Ende
Fragen? Fragen!
Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API