iOS
Webservices
Sebastian Meßingfeld
06.06.2013
1© FH AACHEN | Sebastian Meßingfeld
Inhalt
2© FH AACHEN | Sebastian Meßingfeld
•  Unterstützung von Webservices in iOS
•  Allgemein
•  SOAP
•  REST
•  Fazit
•  Demo
•  Tools
Webservices
Allgemein
•  keine komfortable Unterstützung für REST / SOAP
und andere WS in Cocoa Touch vorhanden
•  keine speziellen WS-API vorhanden
•  rudimentäre Abfrage von Ressourcen über URLs
möglich
•  deckt Möglichkeiten des HTTP-Protokoll ab
•  Verarbeitung von Rückgaben
•  keine komfortable XML/JSON/CVS ... API für
Verarbeitung in Cocoa Touch vorhanden
•  siehe Praktikum „Daten“
•  Verwendung von Dritt-Bibliotheken nötig
3© FH AACHEN | Sebastian Meßingfeld
Webservices
Allgemein
•  keine „Rapid-Prototyping“-Unterstützung für
Entwicklung / zum Testen
•  wie, z.B. generelle Kommunikation mit WS
•  + Erweiterungen, wie OAuth
•  REST-Lösung:
•  Skript-Sprachen: schnelle Implementierung (Ruby)
•  Tools: SoapUI (mit WADL)
•  SOAP-Lösung:
•  Tools: SoapUI, Oxygen XML Editor (beides WSDL)
•  Ergebnisse des Prototypings können nicht direkt in
Cocoa Touch weiterverwendet / -verarbeitet werden
4© FH AACHEN | Sebastian Meßingfeld
Webservice
Testen - SoapUI
•  SoapUI: Test-Tool für Webservices
•  Unterstützung für SOAP und REST
•  SOAP-Unterstützung besser, da WSDL immer
vorhanden ist
•  Unterstützung für WADL für REST auch
vorhanden
•  WS-Abfragen sind über eine dynamische GUI
möglich
5© FH AACHEN | Sebastian Meßingfeld
Webservices
Testen – SoapUI (Beispiel SOAP Abfrage)
6© FH AACHEN | Sebastian Meßingfeld
Webservices
Kommunikation über HTTP mittels Cocoa Touch
7© FH AACHEN | Sebastian Meßingfeld
•  HTTP-Requests möglich
•  synchron
•  asynchron (Verarbeitung über Callback-Methoden)
•  Requests anpassbar
•  HTTP-Methode („POST“, „GET“)
•  HTTP-Header (Standard + eigene)
•  POST-Daten
•  Kommunikation zu allen Webservices damit
möglich
•  ggf. jedoch sehr aufwendig
Webservices
HTTP Request in Cocoa Touch (Beispiel)
8© FH AACHEN | Sebastian Meßingfeld
// Request mit Ziel-URL erstellen!
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL
" " URLWithString:@"http://localhost:8888/ios.php"]];!
// HTTP-Methode setzen!
[request setHTTPMethod:@"POST"];!
!
// Modifizieren / Hinzufuegen von HTTP-Headern!
[request setValue:@"Access-Control-Max-Age" forHTTPHeaderField:@"1728000"];!
!
// POST-Daten!
// Key-Value-Paare!
NSString *postFields = @"username=Max&passwort=Mustermann";!
// "Rohdaten”!
NSString *postRaw = @"{'username':'Max','password':'Mustermann'}";!
!
// Setzen der zu sendenen Daten (postRaw oder postFields)!
NSData *postData = [postRaw dataUsingEncoding:NSUTF8StringEncoding];!
[request setHTTPBody:postData];!
!
// Request absetzen!
[NSURLConnection sendSynchronousRequest:request returningResponse:nil
" " " " " error:nil];
SOAP
9© FH AACHEN | Sebastian Meßingfeld
Webservices
SOAP – Waaruuummmm?
10© FH AACHEN | Sebastian Meßingfeld
Webservices
SOAP – Cocoa Touch
11© FH AACHEN | Sebastian Meßingfeld
•  keine Lösung in Cocoa Touch vorhanden
•  Request
•  XML-DOM selbst zusammenbauen
•  String-Verknüpfung (als eine Art Template)
•  Response
•  NSXML (SAX)
•  libxml2 (DOM-Verarbeitung / C Bibliothek)
•  Dritt-Bibliothek: z.B. TouchXML
•  keine (gute) Dritt-Bibliothek für SOAP vorhanden
Webservices
SOAP – Code-Generierung
12© FH AACHEN | Sebastian Meßingfeld
•  Generierung von Code auf Basis von WSDL
•  mittels wsdl2objc
•  Abstrahierung der Soap Requests
•  erzeugt im „Hintergrund“ XML Baum für Request
Webservices
SOAP – Code-Generierung mittels wsdl2objc
13© FH AACHEN | Sebastian Meßingfeld
•  Vorteile
•  Verwendung des WS über ObjC Methoden
•  wenig Berührungspunkte mit XML
•  SOAPSecurity vorhanden (Signierung / Zertifikate)
•  nicht getestet
•  Nachteile
•  erzeugt 13.952 Zeilen („statischen“) Code
•  Kenntnisse über den Aufbau des WS nötig
•  Tool ist „alt“ und wird nicht weiter gepflegt
•  erzeugt keinen ARC-Code
•  Code funktionierte nur nach eigenen Anpassungen
(bei Bing WS)
•  kein parameters Knoten im Request erzeugt
Webservices
SOAP – Code-Generierung mittels wsdl2objc
14© FH AACHEN | Sebastian Meßingfeld
BingPortBinding *binding = [BingServiceSvc BingPortBinding];!
binding.logXMLInOut = @YES;!
!
// Erzeugung des Services!
BingServiceSvc_SearchRequest *request = [BingServiceSvc_SearchRequest new];!
request.AppId = @”****************************************";!
request.Version = @"2.2";!
request.Query = @"Borussia Dortmund";!
request.Adult = BingServiceSvc_AdultOption_Moderate;!
!
// Source Typen festlegen!
BingServiceSvc_ArrayOfSourceType* sources = [BingServiceSvc_ArrayOfSourceType new];!
[sources addSourceType:BingServiceSvc_SourceType_Web];!
!
// Web-Request !
BingServiceSvc_WebRequest *webRequest = [BingServiceSvc_WebRequest new];!
webRequest.Offset = @0;!
webRequest.Count = @1;!
!
request.Sources = sources;!
request.Web = webRequest;!
!
// Ergebnisse verarbeiten!
BingPortBindingResponse *response = [binding SearchUsingParameters:request];!
NSArray *responseHeaders = response.headers;!
NSArray *responseBodyParts = response.bodyParts;
REST
15© FH AACHEN | Sebastian Meßingfeld
Webservices
REST – Alle nutzen REST
16© FH AACHEN | Sebastian Meßingfeld
Webservices
REST
17© FH AACHEN | Sebastian Meßingfeld
•  Keine native Unterstützung in Coacoa Touch
•  Interaktion durch direkte HTTP-Requests oder
Dritt-Bibliotheken
•  Restly
•  RestKit
•  Keine WADL Unterstützung
Webservices
REST – RestKit
18© FH AACHEN | Sebastian Meßingfeld
•  Objective-C Framework für iOS zur Interaktion
mit RESTful WS
•  „simple, fast and fun“
•  Umfangreiche Funktionalität
•  HTTP Request/Response System
•  Object-Mapper
•  Core Data Support
•  Unterstützt JSON
•  Erweiterbar um weitere Parser (z.B. XML)
Webservices
REST – Request und Mapping
19© FH AACHEN | Sebastian Meßingfeld
NSURL *baseUrl = [NSURL URLWithString:@"http://foo.bar/api1/"];!
!
// ObjectManager für WS erstellen!
RKObjectManager* manager = [RKObjectManager managerWithBaseURL:baseUrl];!
[manager.HTTPClient setDefaultHeader:@"X-Custom-Header" value:@"foobar"];!
!
// Router für Klasse Article setzen!
[manager.router.routeSet addRoute:[RKRoute routeWithClass:[Article class] !
pathPattern:@"/articles/:articleID/" method:RKRequestMethodGET]];!
!
// leeres Article-Objekt für Response erstellen!
Article *article = [Article new];!
!
// GET Request senden an '/articles/12345‘!
[manager getObject:article path:nil parameters:nil
success:^(RKObjectRequestOperation *operation, RKMappingResult *result) {!
NSLog(@"Loading mapping result: %@", result);!
} failure:nil];!
Fazit
20© FH AACHEN | Sebastian Meßingfeld
Webservices
Fazit für iOS
21© FH AACHEN | Sebastian Meßingfeld
•  keine einheitlichen Standards bei WS vorhanden
•  bspw. Authentifizierung
•  SOAP Unterstützung quasi nicht vorhanden
•  „REST“ hat (zu) viele Ausprägungen
•  Zugriffe auf Webservices nicht immer „App-
geeignet“
•  bspw. Authentifizierung (OAuth: Callback)
•  daher Zugriffe auf Webservice häufig über SDK
des Webservice-Anbieters (Facebook, Twitter, ...)
Demo
22© FH AACHEN | Sebastian Meßingfeld
Tools / Bibliotheken
•  SOAP / XML
•  SoapUI
•  http://www.soapui.org/
•  Oxygen XML Editor
•  WSDL SOAP Analysator
•  wsdl2objc
•  https://code.google.com/p/wsdl2objc/
23© FH AACHEN | Sebastian Meßingfeld
FH Aachen
Fachbereich Elektrotechnik & Informationstechnik
Sebastian Meßingfeld
24© FH AACHEN | Sebastian Meßingfeld

Apple iOS - Webservices

  • 1.
  • 2.
    Inhalt 2© FH AACHEN| Sebastian Meßingfeld •  Unterstützung von Webservices in iOS •  Allgemein •  SOAP •  REST •  Fazit •  Demo •  Tools
  • 3.
    Webservices Allgemein •  keine komfortableUnterstützung für REST / SOAP und andere WS in Cocoa Touch vorhanden •  keine speziellen WS-API vorhanden •  rudimentäre Abfrage von Ressourcen über URLs möglich •  deckt Möglichkeiten des HTTP-Protokoll ab •  Verarbeitung von Rückgaben •  keine komfortable XML/JSON/CVS ... API für Verarbeitung in Cocoa Touch vorhanden •  siehe Praktikum „Daten“ •  Verwendung von Dritt-Bibliotheken nötig 3© FH AACHEN | Sebastian Meßingfeld
  • 4.
    Webservices Allgemein •  keine „Rapid-Prototyping“-Unterstützungfür Entwicklung / zum Testen •  wie, z.B. generelle Kommunikation mit WS •  + Erweiterungen, wie OAuth •  REST-Lösung: •  Skript-Sprachen: schnelle Implementierung (Ruby) •  Tools: SoapUI (mit WADL) •  SOAP-Lösung: •  Tools: SoapUI, Oxygen XML Editor (beides WSDL) •  Ergebnisse des Prototypings können nicht direkt in Cocoa Touch weiterverwendet / -verarbeitet werden 4© FH AACHEN | Sebastian Meßingfeld
  • 5.
    Webservice Testen - SoapUI • SoapUI: Test-Tool für Webservices •  Unterstützung für SOAP und REST •  SOAP-Unterstützung besser, da WSDL immer vorhanden ist •  Unterstützung für WADL für REST auch vorhanden •  WS-Abfragen sind über eine dynamische GUI möglich 5© FH AACHEN | Sebastian Meßingfeld
  • 6.
    Webservices Testen – SoapUI(Beispiel SOAP Abfrage) 6© FH AACHEN | Sebastian Meßingfeld
  • 7.
    Webservices Kommunikation über HTTPmittels Cocoa Touch 7© FH AACHEN | Sebastian Meßingfeld •  HTTP-Requests möglich •  synchron •  asynchron (Verarbeitung über Callback-Methoden) •  Requests anpassbar •  HTTP-Methode („POST“, „GET“) •  HTTP-Header (Standard + eigene) •  POST-Daten •  Kommunikation zu allen Webservices damit möglich •  ggf. jedoch sehr aufwendig
  • 8.
    Webservices HTTP Request inCocoa Touch (Beispiel) 8© FH AACHEN | Sebastian Meßingfeld // Request mit Ziel-URL erstellen! NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL " " URLWithString:@"http://localhost:8888/ios.php"]];! // HTTP-Methode setzen! [request setHTTPMethod:@"POST"];! ! // Modifizieren / Hinzufuegen von HTTP-Headern! [request setValue:@"Access-Control-Max-Age" forHTTPHeaderField:@"1728000"];! ! // POST-Daten! // Key-Value-Paare! NSString *postFields = @"username=Max&passwort=Mustermann";! // "Rohdaten”! NSString *postRaw = @"{'username':'Max','password':'Mustermann'}";! ! // Setzen der zu sendenen Daten (postRaw oder postFields)! NSData *postData = [postRaw dataUsingEncoding:NSUTF8StringEncoding];! [request setHTTPBody:postData];! ! // Request absetzen! [NSURLConnection sendSynchronousRequest:request returningResponse:nil " " " " " error:nil];
  • 9.
    SOAP 9© FH AACHEN| Sebastian Meßingfeld
  • 10.
    Webservices SOAP – Waaruuummmm? 10©FH AACHEN | Sebastian Meßingfeld
  • 11.
    Webservices SOAP – CocoaTouch 11© FH AACHEN | Sebastian Meßingfeld •  keine Lösung in Cocoa Touch vorhanden •  Request •  XML-DOM selbst zusammenbauen •  String-Verknüpfung (als eine Art Template) •  Response •  NSXML (SAX) •  libxml2 (DOM-Verarbeitung / C Bibliothek) •  Dritt-Bibliothek: z.B. TouchXML •  keine (gute) Dritt-Bibliothek für SOAP vorhanden
  • 12.
    Webservices SOAP – Code-Generierung 12©FH AACHEN | Sebastian Meßingfeld •  Generierung von Code auf Basis von WSDL •  mittels wsdl2objc •  Abstrahierung der Soap Requests •  erzeugt im „Hintergrund“ XML Baum für Request
  • 13.
    Webservices SOAP – Code-Generierungmittels wsdl2objc 13© FH AACHEN | Sebastian Meßingfeld •  Vorteile •  Verwendung des WS über ObjC Methoden •  wenig Berührungspunkte mit XML •  SOAPSecurity vorhanden (Signierung / Zertifikate) •  nicht getestet •  Nachteile •  erzeugt 13.952 Zeilen („statischen“) Code •  Kenntnisse über den Aufbau des WS nötig •  Tool ist „alt“ und wird nicht weiter gepflegt •  erzeugt keinen ARC-Code •  Code funktionierte nur nach eigenen Anpassungen (bei Bing WS) •  kein parameters Knoten im Request erzeugt
  • 14.
    Webservices SOAP – Code-Generierungmittels wsdl2objc 14© FH AACHEN | Sebastian Meßingfeld BingPortBinding *binding = [BingServiceSvc BingPortBinding];! binding.logXMLInOut = @YES;! ! // Erzeugung des Services! BingServiceSvc_SearchRequest *request = [BingServiceSvc_SearchRequest new];! request.AppId = @”****************************************";! request.Version = @"2.2";! request.Query = @"Borussia Dortmund";! request.Adult = BingServiceSvc_AdultOption_Moderate;! ! // Source Typen festlegen! BingServiceSvc_ArrayOfSourceType* sources = [BingServiceSvc_ArrayOfSourceType new];! [sources addSourceType:BingServiceSvc_SourceType_Web];! ! // Web-Request ! BingServiceSvc_WebRequest *webRequest = [BingServiceSvc_WebRequest new];! webRequest.Offset = @0;! webRequest.Count = @1;! ! request.Sources = sources;! request.Web = webRequest;! ! // Ergebnisse verarbeiten! BingPortBindingResponse *response = [binding SearchUsingParameters:request];! NSArray *responseHeaders = response.headers;! NSArray *responseBodyParts = response.bodyParts;
  • 15.
    REST 15© FH AACHEN| Sebastian Meßingfeld
  • 16.
    Webservices REST – Allenutzen REST 16© FH AACHEN | Sebastian Meßingfeld
  • 17.
    Webservices REST 17© FH AACHEN| Sebastian Meßingfeld •  Keine native Unterstützung in Coacoa Touch •  Interaktion durch direkte HTTP-Requests oder Dritt-Bibliotheken •  Restly •  RestKit •  Keine WADL Unterstützung
  • 18.
    Webservices REST – RestKit 18©FH AACHEN | Sebastian Meßingfeld •  Objective-C Framework für iOS zur Interaktion mit RESTful WS •  „simple, fast and fun“ •  Umfangreiche Funktionalität •  HTTP Request/Response System •  Object-Mapper •  Core Data Support •  Unterstützt JSON •  Erweiterbar um weitere Parser (z.B. XML)
  • 19.
    Webservices REST – Requestund Mapping 19© FH AACHEN | Sebastian Meßingfeld NSURL *baseUrl = [NSURL URLWithString:@"http://foo.bar/api1/"];! ! // ObjectManager für WS erstellen! RKObjectManager* manager = [RKObjectManager managerWithBaseURL:baseUrl];! [manager.HTTPClient setDefaultHeader:@"X-Custom-Header" value:@"foobar"];! ! // Router für Klasse Article setzen! [manager.router.routeSet addRoute:[RKRoute routeWithClass:[Article class] ! pathPattern:@"/articles/:articleID/" method:RKRequestMethodGET]];! ! // leeres Article-Objekt für Response erstellen! Article *article = [Article new];! ! // GET Request senden an '/articles/12345‘! [manager getObject:article path:nil parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *result) {! NSLog(@"Loading mapping result: %@", result);! } failure:nil];!
  • 20.
    Fazit 20© FH AACHEN| Sebastian Meßingfeld
  • 21.
    Webservices Fazit für iOS 21©FH AACHEN | Sebastian Meßingfeld •  keine einheitlichen Standards bei WS vorhanden •  bspw. Authentifizierung •  SOAP Unterstützung quasi nicht vorhanden •  „REST“ hat (zu) viele Ausprägungen •  Zugriffe auf Webservices nicht immer „App- geeignet“ •  bspw. Authentifizierung (OAuth: Callback) •  daher Zugriffe auf Webservice häufig über SDK des Webservice-Anbieters (Facebook, Twitter, ...)
  • 22.
    Demo 22© FH AACHEN| Sebastian Meßingfeld
  • 23.
    Tools / Bibliotheken • SOAP / XML •  SoapUI •  http://www.soapui.org/ •  Oxygen XML Editor •  WSDL SOAP Analysator •  wsdl2objc •  https://code.google.com/p/wsdl2objc/ 23© FH AACHEN | Sebastian Meßingfeld
  • 24.
    FH Aachen Fachbereich Elektrotechnik& Informationstechnik Sebastian Meßingfeld 24© FH AACHEN | Sebastian Meßingfeld