3. Juli 2014, IBM Client Center Ehningen

Ähnliche Dokumente
RESTful Web. Representational State Transfer

Wiederholung: Beginn

Anleitung über den Umgang mit Schildern

Artikel Schnittstelle über CSV

FORUM HANDREICHUNG (STAND: AUGUST 2013)

Enigmail Konfiguration

Web Services stellen eine Integrationsarchitektur dar, die die Kommunikation zwischen verschiedenen Anwendungen

Änderungsbeschreibung HWS32 SEPA Überweisungen

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Das Leitbild vom Verein WIR

Kapitel 3. Codierung von Text (ASCII-Code, Unicode)

! " # $ " % & Nicki Wruck worldwidewruck

Connecting Content. User Manual. Version: 1.2

In diesem Thema lernen wir die Grundlagen der Datenbanken kennen und werden diese lernen einzusetzen. Access. Die Grundlagen der Datenbanken.

Verarbeitung der Eingangsmeldungen in einem Callcenter

Das RSA-Verschlüsselungsverfahren 1 Christian Vollmer

Anleitung zur Verwendung der VVW-Word-Vorlagen

OP-LOG

Windows 10 > Fragen über Fragen

Anleitung Typo3-Extension - Raumbuchungssystem

Anleitung zur Daten zur Datensicherung und Datenrücksicherung. Datensicherung

Zählen von Objekten einer bestimmten Klasse

L10N-Manager 3. Netzwerktreffen der Hochschulübersetzer/i nnen Mannheim 10. Mai 2016

Der vorliegende Konverter unterstützt Sie bei der Konvertierung der Datensätze zu IBAN und BIC.

Modul 2.2: Zugang zu Ihren Teilnehmer-Ordnern via ftp (zum Dateientransfer):

Ein Tool zum Konvertieren von Pegasus Mail Adressbüchern und Verteilerlisten in Novell Groupwise Adressbücher.

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

Access Grundlagen für Anwender. Andrea Weikert 1. Ausgabe, 1. Aktualisierung, Juli inkl. zusätzlichem Übungsanhang ACC2010-UA

Einrichten eines POP-Mailkontos unter Thunderbird Mail DE:

Mit jedem Client, der das Exchange Protokoll beherrscht (z.b. Mozilla Thunderbird mit Plug- In ExQulla, Apple Mail, Evolution,...)

Kommunikations-Management

Java und XML 2. Java und XML

Das *z13-file Handling V1.0d

Beschreibung Regeln z.b. Abwesenheitsmeldung und Weiterleitung

WebService in Java SE und EE

Verteilte Systeme: Übung 4

Einrichten eines Postfachs mit Outlook Express / Outlook bis Version 2000

Web-Kürzel. Krishna Tateneni Yves Arrouye Deutsche Übersetzung: Stefan Winter

Leichte-Sprache-Bilder

Überprüfung der digital signierten E-Rechnung

Reporting Services und SharePoint 2010 Teil 1

Implementierung von Web Services: Teil I: Einleitung / SOAP

Benutzerhandbuch. Leitfaden zur Benutzung der Anwendung für sicheren Dateitransfer.

M-net -Adressen einrichten - Apple iphone

Leitfaden zur ersten Nutzung der R FOM Portable-Version für Windows (Version 1.0)

STRATO Mail Einrichtung Mozilla Thunderbird

Ein Hinweis vorab: Mailkonfiguration am Beispiel von Thunderbird

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Anlegen eines DLRG Accounts


Steganos Secure Schritt für Schritt-Anleitung für den Gastzugang SCHRITT 1: AKTIVIERUNG IHRES GASTZUGANGS

Ordner Berechtigung vergeben Zugriffsrechte unter Windows einrichten

Dokumentation IBIS Monitor

Inhaltsverzeichnis. 1. Empfängerübersicht / Empfänger hinzufügen 2. Erstellen eines neuen Newsletters / Mailings 3. Versand eines Newsletters

Urlaubsregel in David

SANDBOXIE konfigurieren

Vorgehensweise für die Umstellung von Quicken-Konten bei Bargeldbuchungen auf ein Wertpapierkonto

1 Mathematische Grundlagen

Anleitung zum Login. über die Mediteam- Homepage und zur Pflege von Praxisnachrichten

Die Bundes-Zentrale für politische Bildung stellt sich vor

Einführung in die Java- Programmierung

POP -Konto auf iphone mit ios 6 einrichten

Downloadfehler in DEHSt-VPSMail. Workaround zum Umgang mit einem Downloadfehler

Objektorientierte Programmierung

AutoTexte und AutoKorrektur unter Outlook verwenden

Seite 1 von 14. Cookie-Einstellungen verschiedener Browser

Handbuch zur Anlage von Turnieren auf der NÖEV-Homepage

Viele Bilder auf der FA-Homepage

SEPA-Anleitung zum Release 3.09

Zahlensysteme: Oktal- und Hexadezimalsystem

iphone-kontakte zu Exchange übertragen

1 Konto für HBCI/FinTS mit Chipkarte einrichten

1. Man schreibe die folgenden Aussagen jeweils in einen normalen Satz um. Zum Beispiel kann man die Aussage:

FuxMedia Programm im Netzwerk einrichten am Beispiel von Windows 7

Auto-Provisionierung tiptel 30x0 mit Yeastar MyPBX

Datenbanken Kapitel 2

Anleitung zur Verwendung der VVW-Word-Vorlagen

Leitfaden zu Windata Professional 8

1. Adressen für den Serienversand (Briefe Katalogdruck Werbung/Anfrage ) auswählen. Die Auswahl kann gespeichert werden.

Erstellen einer digitalen Signatur für Adobe-Formulare

Enterprise Applikation Integration und Service-orientierte Architekturen. 09 Simple Object Access Protocol (SOAP)

Flashfragen in ILIAS Test & Assessment. Helmut Schottmüller

EasyWk DAS Schwimmwettkampfprogramm

Adobe Photoshop. Lightroom 5 für Einsteiger Bilder verwalten und entwickeln. Sam Jost

In diesem Tutorial lernen Sie, wie Sie einen Termin erfassen und verschiedene Einstellungen zu einem Termin vornehmen können.

Stammdatenanlage über den Einrichtungsassistenten

Bilder Schärfen und Rauschen entfernen

Die Textvorlagen in Microsoft WORD und LibreOffice Writer

Handbuch. timecard Connector Version: REINER SCT Kartengeräte GmbH & Co. KG Goethestr Furtwangen

Elexis-BlueEvidence-Connector

Guide DynDNS und Portforwarding

BüroWARE Exchange Synchronisation Grundlagen und Voraussetzungen

Über die Internetseite Hier werden unter Download/aktuelle Versionen die verschiedenen Module als zip-dateien bereitgestellt.

FAQ s für die Exchange Migration

bitte auf den Button Baudaten-Fenster öffnen klicken. (oder über das Menü -> STAMMDATEN -> BAUDATEN anklicken)

News & RSS. Einleitung: Nachrichten er-(veröffentlichen) und bereitstellen Nachrichten erstellen und bereitstellen

Eine Anleitung, wie Sie Mozilla Thunderbird 2 installieren und konfigurieren können. Installation Erstkonfiguration... 4

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Transkript:

3. Juli 2014, IBM Client Center Ehningen

Thomas Niedergesäß 42 Jahre alt seit 15 Jahren bei Tricept Braunschweig Chief Architect Java Solutions technisch und fachlich unterwegs im Bankbereich C, C++, ObjC Smalltalk Java Batchverarbeitung Client-Server WebSphere Java auf System z Webservices (Plattformunabhängige Entwicklung mobiler Anwendungen mit Java) thomas.niedergesaess@tricept.de Tel.: +49 5231 61663-37 Frankfurter Straße 2 38122 Braunschweig Seite 1

Aufgaben, Erwartungen und Fragen Anforderung Verpacken und versenden Sie Daten. Verstehen alle Empfänger diese richtig? Methodik Technik Inhalt Verwenden Sie dazu moderne Webservices. Funktionieren diese weltweit? Was bieten JAX-WS und JAX-RS technisch? Sind sie austauschbar? Das Datenformat JSON ist modern. Genügt es den fachlichen Anforderungen? Also ganz normale Fragen im Tagesgeschäft. Seite 2

In der nächsten Dreiviertelstunde, den nächsten 45 Minuten Teil 1 Datenübertragung Probleme im Datenaustausch fehlende Zeichen und Codepages Codierungsstandard Unicode Teil 2 Webservices und JSON SOAP-Webservices (JAX-WS) RESTful Webservices (JAX-RS) Parameterübergabe, Ergebnis- und Fehlerrückgabe Austauschbarkeit von Schnittstellen JSON als Transport-Container Fachliche Daten Beispiele Seite 3

Für wen sind meine Daten bestimmt? VOYAGER 1977 Die Voyager Golden Records sind Datenplatten mit Bild- und Audio- Informationen, die an Bord der beiden 1977 gestarteten interstellaren Raumsonden Voyager 1 und Voyager 2 angebracht sind. Die Datenplatten wurden als Botschaften an Außerirdische in der Hoffnung hergestellt, etwaige intelligente, außerirdische Lebensformen könnten dadurch von der Menschheit und ihrer Position im Universum erfahren. Die Platten besitzen eine geschätzte Lebensdauer von 500 Millionen Jahren. Auf ihrer Außenseite befindet sich eine Erklärung, wie man die Datenplatte abspielen bzw. decodieren kann. Die dazu nötigen Zeitangaben sind binär angegeben und beziehen sich auf die charakteristische Schwingfrequenz des Wasserstoffatoms, das ebenfalls dargestellt ist. Anleitungen (in symbolischer Sprache) erklären den Abflugort der Sonden. [Quelle: Wikipedia] Eine Nachricht an unbekannte Empfänger, mit Decodierungsanweisung. Ganz so kompliziert ist unsere Datenkommunikation jedoch nicht, oder etwa doch? Seite 4

Was sind das eigentlich für Daten und was soll ich damit machen? 1400529347250 java.util.gregoriancalendar c = new java.util.gregoriancalendar(); c.settimeinmillis(1400529347250); java.lang.system.out.println(c.tozoneddatetime()); 2014-05-19T21:55:47.250+02:00[Europe/Berlin] 1400529347250-31536000000 Vielleicht ist das aber auch einfach nur eine sehr große Zahl, die keinerlei Bedeutung besitzt! java.util.gregoriancalendar c = new java.util.gregoriancalendar(); c.settimeinmillis(-31536000000); java.lang.system.out.println(c.tozoneddatetime()); 1969-01-01T01:00+01:00[Europe/Berlin] Alles eine Sache der Interpretation! Seite 5

Was ist gemeint und was verstehe ich? 9.5.2012 Das ist der 9. Mai 2012. 9-5-2012 9/5/2012 Das ist der 9. Mai 2012. 9-5-2012 9/5/2012 Das ist der 5. September 2012! dd/mm/yyyy!= mm/dd/yyyy Mein Verständnis ist ortsabhängig! Seite 6

Versteht der Empfänger, mit welchen Einheiten ich arbeite? Mars 23.9.1999 Neben der NASA waren mehrere Privatunternehmen an dem Großprojekt Mars Climate Orbiter beteiligt. Diese rechneten im angloamerikanischen Maßsystem, die NASA jedoch im metrischen System. falsche Steueranweisungen falsche Flugbahn Verlust der Sonde Im Dezember ging dann auch noch der Mars Polar Lander aus demselben Grund verloren, er war leider schon gestartet worden. Kraftangaben in Newton!= Kraftangaben in pound Beachten Sie regionale Einheiten! Webservices können international genutzt werden! Seite 7

Warum wird ausgerechnet mein Name immer falsch geschrieben? Diese Probleme sind uralt! Seite 8

Das Problem mit den Standards für die 8-Bit-Zeichencodierung ISO 8859-1 Die ersten 7 Bit entsprechen US-ASCII Kompatibilität. Es fehlt z. B. das Eurozeichen. ISO 8859-15 Windows-1252 Alternative zu 8859-1 enthält das Eurozeichen baut auf 8859-1 und 8859-15 auf Wo 8859 Steuerzeichen verwendet, kann 1252 druckbare Zeichen besitzen. Es ist sehr verbreitet, Windows-1252 Dateien als ISO 8859-1 zu markieren unter Windows OK. Beim Umzug auf ein Nicht-Windows-System führt das zu Darstellungsfehlern (z. B. typographische Anführungszeichen Fragezeichen). Unschöner Workaround im HTML5-Standard: Interpretiere alle als ISO 8859-1 markierten Texte als Windows-1252, um sie auch korrekt darstellen zu können! Seite 9

Ist das die Lösung? kurz: JA UNICODE = Standard für moderne Zeichencodierung Die Codierung aller Zeichen der Welt ist damit möglich (> 4 Mrd. Zeichen). ständige Erweiterung, keine Löschungen UTF-32 UTF-16 UTF-8 UTF = Unicode Transformation Format definierte Methode, Zeichen auf Folgen von 1, 2, 3, oder 4 Bytes abzubilden Jedes UTF-Format lässt sich verlustfrei in ein anderes transformieren. UTF-8 ist der Internet-Standard! Seite 10

Welches Datei-Encoding verwenden Sie in Ihren Editoren oder Entwicklungsumgebungen? UTF-8 US ASCII ISO-8859-1 UTF-8 Betriebssysteme ändern sich und Editoren veralten! Vereinbaren Sie ein durchgängiges Encoding für die Projektdateien! Seite 11

Inhalt JAX-WS JAX-RS moderne Java-Webservices Unterscheidung Parameterübergabe Ergebnis- und Fehlerrückgabe JSON ein sprachunabhängiger Container für den Datenaustausch Verwendung und Codierung komplexe Datentypen technische und fachliche Daten Seite 12

Was ist denn nun JSON? JavaScript Object Notation ist ein leichtgewichtiges universelles Datenaustauschformat. für Maschinen einfach zu erzeugen für Menschen einfach zu lesen Hashtable in String-Darstellung Kurz und knapp Ein JSON-String ist eine Hashtable bestehend aus atomaren Daten, Arrays und weiteren Hashtables, die nach einem bestimmten Verfahren in eine Zeichenkette serialisiert wurde. Im Prinzip macht es JAXB ähnlich und würde diese Hashtable nach XML konvertieren. Hashtable (Objekt) Serialisierung Zeichenkette (Unicode) Deserialisierung Hashtable (Objekt) Wir wollen kein JavaScript machen und verwenden JSON lediglich als Datencontainer! Seite 13

Was ist gerade modern? 2000 2001 2003 CORBA, alle verwenden IDL (Smalltalk Smalltalk Java) XML-RPC mit Apache-API, alle machen XML (Java Java) Java RMI, alle machen J2EE (Java Java) (WAS 5.0) 2008 JAX-RPC, alle machen SOAP (Java C++) (WAS 7.0) JAX-WS mit Codierung über JAXB Nachfolger von JAX-RPC 2013 JAX-RS, alle machen JSON (Java Java) (WAS 8.5) Umstieg auf JAX-RS im Projekt JAX-RPC in der verwendeten Form war veraltet. SOAP als zu kompliziert für den Client angesehen JAX-WS nicht gewünscht JAX-RS, da ja schon immer JSON verwendet wurde und SOAP nur als Rahmen diente Technik ändert sich Fachlichkeit bleibt. Seite 14

Allgemein Aufrufer Remote-Aufruf Request (n Parameter) Result (1 Ergebnis) Webservice Webservice-Aufruf funktioniert wie ein normaler Java- Methodenaufruf: JAX-WS: Java API for XML Web Services result = func(request) Client SOAP-Nachricht SOAP-Nachricht Endpunkt SOAP = XML JAX-RS: Java API for RESTful Web Services Client JSON-String JSON-String Ressource Austausch von lesbaren Zeichenketten in Unicode UTF-8 codiert! JSON!= XML JSON ist hier nicht nötig, aber schick und modern! Seite 15

SOAP-Nachrichten und JAX-WS Envelope Header Body SOAP-Nachricht XML (Unicode UTF-8) SOAP(-Nachrichten) = Netzwerkprotokoll!= Simple von JAX-WS für die Parameter (IN) und das Ergebnis (OUT) verwendet besteht aus Steuerdaten und Nutzdaten Java Architecture for XML Binding konvertiert Java-Datentypen in XML-Datentypen und zurück. Beschreibung durch Web Services Description Language End-to-End-Verschlüsselung durch WS-Security möglich Im Body werden beliebige Java-Datentypen durch JAXB in XML konvertiert transportiert! Seite 16

Was ist eigentlich REST? Representational State Transfer ist ein Programmierparadigma für (Web)-Anwendungen. Idee: Ein URL-Aufruf bekommt vom Server genau einen Seiteninhalt zurückgeliefert. Der Uniform Resource Identifier gibt Ort und Name einer Ressource an. Funktionalität wird über HTTP-Verben (z. B. GET, POST, DELETE) abgebildet. Beispiel Person lesen, anlegen und löschen Es gibt eine Ressource Kunden mit veschiedenen Personen. Der Client verwendet das HTTP-Verb GET, um eine Person zu lesen. Der Client verwendet das HTTP-Verb POST, um eine neue Person anzulegen. Der Client verwendet das HTTP-Verb DELETE, um eine bestehende Person zu löschen. URI für Person lesen : http://localhost/kunden/4711 Das sieht nach einem sehr engen Korsett und einigen Restriktionen aus! 4711 GET Kunden Seite 17

Ein paar fachliche Objekte für die Beispiel-Webservices Long id Person Name name Adresse wohnort String telefon GregorianCalendar geburtsdatum Integer koerpergroesse Vector<Konto> konten String name Name String vorname String ort Adresse String postleitzahl String strasse String hausnummer String laenderkennzeichen String pruefziffer Long bankleitzahl String kontonummer IBAN iban BigDecimal kontostand IBAN Konto Ein paar fachliche Methoden Eine individuelle Exception Person lesen (id) Person Fehler Person anlegen (person) {ein Ergebnis} Fehler Personen suchen (name, adresse) Personen Fehler NichtGefundenException int fehlercode String fehlertext Komplexe Datentypen in Webservices sind möglich und fachlich explizit erwünscht! Seite 18

Methode Personen zu Name und Adresse suchen und Vektor von Personen zurückgeben @javax.jws.webmethod Vector<Person> suchepersonen(name name, Adresse wohnort) throws NichtGefundenException Envelope Envelope Envelope Header Body Vector<Person> XML (Unicode UTF-8) Header Body Name, Adresse XML (Unicode UTF-8) Header Body <SOAP-FAULT> XML (Unicode UTF-8) SOAP-Nachricht (OUT) SOAP-Nachricht (IN) SOAP-Nachricht (OUT) Parameter (IN) bestehen aus einem oder mehreren beliebigen Datentypen. Ergebnis (OUT) ist ein beliebiger Datentyp. Im Fehlerfall wird eine beliebige Exception geworfen (OUT). alle optional JAX-WS kann analog zu einem Standard-Java-Methodenaufruf verwendet werden! Seite 19

Verb POST Person anlegen und deren URI zurückgeben @javax.ws.rs.post @javax.ws.rs.consumes (javax.ws.rs.core.mediatype.application_json) Ressource Kunden javax.ws.rs.core.response personanlegen(@context UriInfo info, Person person) { // neue Person anlegen (person p) und URI (= u) zu diesem Datensatz erzeugen URI u = info.getbaseuribuilder().path(kunden.class).path(p.getid()).build); // URI an den Aufrufer zurückgeben return Response.created(u).build(); URI für Person lesen http://localhost/kunden/4742 } HTTP-Verben und ihre Verwendung HTTP-Statuscode: 201 (Unicode 128512) GET (read) POST (create) PUT (update create) PATCH DELETE (delete) HEAD OPTIONS CONNECT TRACE HTTP-Statuscodes 1xx Informationen 2xx Erfolgreiche Operation 3xx Umleitung 4xx Client-Fehler 5xx Server-Fehler 9xx Proprietäre Statuscodes Seite 20

Verb GET Personen zu Name suchen und Vektor von Personen zurückgeben @GET @Path( /personen-suchen/{name} ) @Produces(MediaType.APPLICATION_JSON) Response personensuchen(@pathparam( name ) String name) { // suche alle Personen mit übergebenem Namen name // speichere das Ergebnis im Vektor result (= Vector<Person>) und gib diesen zurück if (result!= null) { } return Response.ok(result).build(); } else { } HTTP-Verb OUT: JSON http://localhost/kunden/personen-suchen/thomas HTTP-Statuscode: 200 // nichts gefunden (fachlicher Fehler), gib einen Standard-Fehler zurück return Response.status(Status.NOT_FOUND).build(); HTTP-Statuscode: 404 Ressource Kunden JAX-RS unterscheidet sich von einem Standard-Java-Methodenaufruf und von JAX-WS! Seite 21

JAX-WS klassisches RPC, eine Methode wird remote mittels einer SOAP-Nachricht aufgerufen Beispiel: loescheperson(4711), leseperson(4742) für Enterprise-Anwendungen, z. B. als Ersatz für RMI JAX-RS JAX-RS stellt eine Ressource remote zur Verfügung, auf der dann eine Aktion (Verb) ausgeführt werden kann. Beispiel: http://localhost/kunden/4742 schlank, optimal für Mobile- und Web-Clients, da Zugang zu den übermittelten Daten sehr einfach Fragestellungen Inwieweit stellen die Exceptions aus JAX-WS die beste Lösung für die Fehlerbehandlung dar? Schränke ich mich durch die Verwendung der HTTP-Statuscodes bei JAX-RS ein? Reichen die HTTP-Verben bei REST in realen Anwendungen aus? Soll ich Standard-Datentypen oder eigene Datentypen verwenden? Oder soll ich gleich JSON-Strings für die Ein- und Ausgabe benutzen? Jedes Modell kann beliebig kompliziert verwendet werden! Seite 22

Was ist ein DTO? Ein Datentransferobjekt ist ein Container für Daten. fasst mehrere Daten zu einem Objekt zusammen enthält primitive Datentypen oder andere DTO Das fachliche Objekt Konto ist ein DTO. IBAN iban BigDecimal kontostand String laenderkennzeichen String pruefziffer Long bankleitzahl String kontonummer Konto IBAN Seite 23

alt Methode Personen zu Name und Adresse suchen und Vektor von Personen zurückgeben @webmethod Vector<Person> suchepersonen(name name, Adresse adresse) throws NichtGefundenException Neue Methode mit Datentransferobjekten @webmethod ResultDTO suchepersonenneu(requestdto request) ResultDTO int fehlercode Vector<Person> RequestDTO Name name Adresse adresse Envelope Header Body XML (Unicode UTF-8) eigener Fehlercode für Nicht gefunden, z. B. -99 SOAP-Nachricht Datentransferobjekte kapseln Parameter (Request) und Ergebnis (Result) und sogar Fehlercodes! Seite 24

alt Verb GET Personen zu Name suchen und Vektor von Personen zurückgeben @GET @Path( /personen-suchen/{name} ) @Produces(MediaType.APPLICATION_JSON) Response personensuchen(@pathparam( name ) String name) Ressource Kunden Neue Verwendung für das Verb GET mit Datentransferobjekten @GET @Path( /personen-suchen-neu/{jsonparameterstring} ) @Consumes(MediaType.MEDIA_TYPE_WILDCARD) @Produces(MediaType.MEDIA_TYPE_WILDCARD) Zeichenketten Response personensuchenneu(@pathparam( jsonparameterstring ) String jsonparameterstring) { // konvertiere den JSON-Parameter-String RequestDTO (Java-Objekt) // führe Business-Logik aus, bestücke das ResultDTO und konvertiere es JSON-Ergebnis-String // gib immer OK (HTTP-Statuscode 200) und den JSON-Ergebnis-String zurück return Response.ok(jsonErgebnisString).build(); } JSON-Strings werden in Datentransferobjekte konvertiert und umgekehrt! Seite 25

Datentransferobjekte Für jede veröffentlichte Webservice-Methode werden Datentransferobjekte eingeführt. Request-DTO enthält alle Parameter (IN). Result-DTO enthält das Ergebnis (OUT) und einen Fehlercode (OUT). JAX-WS Es werden keine Exceptions (SOAP-Faults) verwendet. SOAP-Nachrichten sind nur noch Transportrahmen für Request- und Result-Datentransferobjekte. JAX-RS HTTP-Status-Code 200 für OK wird immer zurückgeliefert. HTTP-Verb GET wird immer verwendet Test im Webbrowser ist möglich. Request- und Result-DTO werden in JSON-Strings umgewandelt und umgekehrt. Es werden nur Strings übertragen. MEDIA_TYPE_WILDCARD. Dieselben Datentransferobjekte werden in beiden Webservice-Arten wiederverwendet! Seite 26

JSON-Konvertierung für die Ergebnisrückgabe in einem Projekt Erzeuge eine Hashtable<String>. Befülle diese mit den in Strings konvertierten Rückgabedaten. Verwende den JSON-Prozessor Flexjson für die Serialisierung: Hashtable JSON-String Gib diese Zeichenkette an den Client zurück! ID 4711 Hashtable NAME Peter <String> TELEFON +491631234567 GEBURTSDATUM 19.05.2014 KOERPERGROESSE 171 cm Flexjson [ { "ID" : "4711", JSON-String "NAME" : "Peter", "TELEFON" : "+491631234567", "GEBURTSDATUM" : "19.05.2014", "KOERPERGROESSE" : "171 cm" } ] Vor der Serialisierung wurde das Datum (GregorianCalendar) in ein vom Fachbereich gewünschtes String-Format konvertiert (TT.MM.JJJJ). Objekte werden zunächst in Strings konvertiert und dann erst serialisiert! Seite 27

Konvertierung im WebSphere Application Server Die Konvertierung in JSON-Strings kann natürlich wie im vorherigen Beispiel erfolgen. Die JAX-RS Runtime des WAS verwendet den JSON-Prozessor Jackson. Jackson serialisiert und deserialisiert automatisch: (komplexe) Java-Objekte Strings [ { "GEBURTSDATUM" : 1400529347250 } ] Einige Datumsobjekte werden leider nur als numerische Timestamps serialisiert, andere nicht. { "Gregorian-Cal" : 1403070056020, "SQL-Date" : "2014-06-18", "Util-Date" : 1403070056020 } Die Standard-Serialisierung kann durch das Implementieren eigener Klassen übersteuert werden. Datum im Format ISO 8601 (JJJJ-MM-TT) Vorsicht mit automatischen Formatkonvertierungen! Behalten Sie die Kontrolle über Ihre fachlichen Datenformate! Seite 28

Was macht der JSON-Prozessor aus meinen Zahlen? java.lang.double(123.01) { "betrag" : 123.01 } java.lang.double(123456789.01) { "betrag" : 1.2345678901E8 } java.math.bigdecimal("123456789.01") { "betrag" : 123456789.01 } java.math.biginteger("12345678") { "blz" : 12345678 } kein Problem mit Anzahl der Stellen Rückkonvertierung bei unterschiedlichen JSON-Prozessoren java.math.bigdecimal("123456789123.123456789") { "betrag" : 123456789123.123456789 } { "betrag" : 123456789123.123456789 } 1.2345678912312346E11 Vorsicht mit unterschiedlichen JSON-Prozessoren! Prüfen Sie, wie der Prozessor Zahlen konvertiert. Vereinbaren Sie eine Konvention! automatisch gerundet! Seite 29

Wie geht man mit fehlenden Einträgen um? { "key-1" : "value-1", "key-2" : "value-2" } { "name" : "Müller", "vorname" : "Peter" } { "name" : "Müller", "vorname" : "" } { "name" : "Müller" } { "beginndatum" : "2005-11-29", "endedatum" : "2025-01-01" } alle Daten vorhanden alle Daten vorhanden Vorname fehlt Leerstring Vorname fehlt kein Eintrag alle Daten vorhanden { "beginndatum " : "0001-01-01", "endedatum" : "9999-12-31" } Datum unbestimmt und unbefristet { "beginndatum " : "", "endedatum" : "" } { } Der Umgang mit fehlenden Einträgen gehört in die Schnittstellendokumentation! Vereinbaren Sie Konventionen, die für alle Schnittstellen gelten! Seite 30

Will ich Daten nur anzeigen oder auch weiterverarbeiten? DE12500105170648489890 DE12 5001 0517 0648 4898 90 { lkz" : "DE", "prz" : "12", "blz" : "50010517", "kto" : "0648489890" } Elektronisches Format Papierformat Einzelattribute 2014-10-28 ISO 8601 28.10.2014 allgemeine Konvention 1234567.9 1 234 567,90 1.234.567,90 1.234.567,90 Floating Point Betrag (gegliedert) Betrag (alternativ gegl.) Betrag mit Währung Wenn der Client Daten nur anzeigt, kann man sie ihm auch gleich richtig formatiert liefern! Vereinbaren Sie die Schnittstellen so, wie der Client sie benötigt. Seite 31

Wie wird der JSON-String erzeugt? mit der JEE 7 Streaming API (javax.json.jsongenerator) automatisch mit @Produces(MediaType.APPLICATION_JSON) manuell, indem der JSON-String direkt erzeugt wird (MEDIA_TYPE_WILDCARD) Wie wird der JSON-String geparst? mit der Streaming API (javax.json.stream.jsonparser) automatisch mit @Consumes(MediaType.APPLICATION_JSON) manuell, indem der JSON-String in eine Hashtable konvertiert wird (z. B. mit Flexjson) Festlegen, ob Daten vor der Konvertierung nach JSON zunächst in Strings konvertiert werden Datumswerte Zahlen Boolean-Werte Behalten Sie es in der Hand, wie der JSON-String aussieht und wie er interpretiert wird! Seite 32

Testfälle Sehen Sie Standard-Testfälle vor, zum Beispiel eine Reise durch Ihre verwendeten Datentypen. JAX-WS JAX-WS 2.0 ist bereits in der Java Standard Edition 6 integriert (eigener HTTP-Server enthalten). sehr mächtig, optimal für Enterprise-Anwendungen SOAP verhindert JSON nicht und denken Sie an Datentransferobjekte. JAX-RS schlankes Modell total angesagt und modern gut geeignet für Mobile-Clients sehr viele Restriktionen, wenn es richtig angewendet wird (Verben, Status-Codes, Ressourcen) Wenn man aber nur das Verb GET und konsequent JSON-Strings verwendet, kann man wunderbar schnell alle Webservices-Methoden im Webbrowser testen. Fachlichkeit vor Technik! Seite 33

(Plattformunabhängige Entwicklung mobiler Anwendungen mit Java am 17. Juli in der Liederhalle Stuttgart) thomas.niedergesaess@tricept.de Tel.: +49 5231 61663-37 Frankfurter Straße 2 38122 Braunschweig Seite 34

Im Anhang finden Sie weiterführende Informationen zu Codepages Unicode Unicode und System z Webservices-Historie Seite 35

Wenn wir schon über falsche Zeichen sprechen Codepage 437 PC-DOS (ursprünglicher IBM-PC) 8-Bit 850 MS-DOS (Windows ME) 1200 Unicode UTF-16 (intern bei Windows, OS X, z/os und Java) 1252 Windows-1252 (baut auf Latin1 und Latin9 auf) 20127 US-ASCII 28591 ISO-8859-1 (Latin1) 28605 ISO-8859-15 (Latin9) 65001 Unicode UTF-8 (Standard des Internet) 8-Bit 16-Bit-Tupel 8-Bit 7-Bit 8-Bit 8-Bit 8-Bit-Tupel Seite 36

Welche Unicode Transformation Formate gibt es? UTF-32 ein Zeichen = 4 Byte viel Speicher einfache Verarbeitung UTF-16 UTF-8 ein Zeichen = 2 Byte oder 4 Byte (für eher exotische Zeichen) erste 256 Zeichen = ISO 8859-1 interne Verwendung bei Windows, OS X, Java,.NET guter Kompromiss ein Zeichen = 1 Byte, 2 Byte, 3 Byte oder 4 Byte in den ersten 7 Bit (128 Zeichen) deckungsgleich mit US-ASCII das 8. Bit leitet längeres Zeichen ein (2, 3 oder 4 Bytes) benötigt für die Codierung englischsprachiger Texte oft nur ein Byte deutsche Umlaute = 2 Byte, Eurozeichen = 3 Byte UTF-16 ist Standard, bei Kommunikation mit externen Nutzern meist UTF-8 (Internet-Standard)! Seite 37

Was ist mit Unicode auf dem Mainframe? UTF-EBCDIC gibt es auch noch für Altanwendungen gedacht wird sehr selten verwendet UTF-16 z/os (USS) DB2 COBOL, PL/I JAVA kein Problem! Verwenden Sie Unicode auf Ihrer z! Seite 38

Eine kurze Klärung der historischen Zusammenhänge: RPC XML-RPC SOAP JAX-RPC JAX-WS JAXB REST JAX-RS definiert entfernte Methodenaufrufe (CORBA, Java RMI, XML-RPC) standardisierter schlanker Protokoll-Vorgänger von SOAP (XML über HTTP) Netzwerkprotokoll mit komplexer Datencodierung (XML über HTTP) Vorgänger von JAX-WS (SOAP-XML über HTTP) SOAP = XML: JAX-WS 2.2 (seit JEE 6) Codierung über JAXB automatische XML-Datenbindung (XSD Java-Klasse, XML Java-Objekt) Idee: Ein URL-Aufruf bekommt genau einen Seiteninhalt zurückgeliefert. REST!= XML: JAX-RS 1.1 (JEE 6) und JAX-RS 2.0 (JEE 7) Seite 39

ABAB ABAB ABAB ABAB 30.6.2014