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