RESTful iOS Apps mit RestKit entwickeln

RestKit ist eine leistungsstarke Bibliothek, die die Interaktion mit Webdiensten für iOS-Anwendungen vereinfacht. In diesem Artikel, geschrieben von RestKit Creator und Two Toasters CTO Blake Watters, werden wir einen kurzen Überblick über die Funktionen von RestKit geben, uns mit den Kernkonzepten der Bibliothek vertraut machen und einige Codebeispiele ausprobieren, um ein Gefühl dafür zu bekommen, was funktioniert mit RestKit ist wirklich so.

Was ist RestKit??

RestKit ist ein Objective-C-Framework für iOS, das die Interaktion mit RESTful-Web-Services einfach, schnell und unterhaltsam gestalten soll. Es kombiniert eine saubere, einfache HTTP-Anforderungs- / Antwort-API mit einem leistungsstarken Objekt-Mapping-System, das die Menge an Code reduziert, den Sie schreiben müssen, um alles zu erledigen. Das Hauptziel von RestKit ist es, dem Entwickler zu ermöglichen, mehr über das Datenmodell seiner Anwendung zu denken und sich weniger um die Details des Sendens von Anforderungen, das Analysieren von Antworten und das Erstellen von Repräsentationen von Remote-Ressourcen zu kümmern.

Was bietet RestKit??

  • Ein einfaches, übergeordnetes HTTP-Anforderungs- / Antwortsystem. RestKit wird mit einem HTTP-Client ausgeliefert, der auf NSURLConnection aufbaut und eine Bibliothek mit hilfreichen Methoden zum Überprüfen von MIME-Typen und Statuscodes enthält. Das Senden von Formulardaten ist so einfach wie das Bereitstellen eines Wörterbuchs mit Parametern, und ein natives Params-Objekt ist für das Erstellen von mehrteiligen Einsendungen enthalten. Eine einfache Unterstützung für das Streaming-Upload großer Dateien (d. H. Videos) wird ebenfalls bereitgestellt.
  • Unterstützung auf Frameworkebene für den Wechsel von Servern und Umgebungen (z. B. Entwicklung, Produktion, Bereitstellung). RestKit verwendet eine Basis-URL und Ressourcenpfade anstelle von vollständigen URLs, damit Sie die Zielserver schnell wechseln können. Das Interpolieren von URL-Strings und das Erstellen von NSURL-Objekten gehören der Vergangenheit an.
  • Ein Objektabbildungssystem. RestKit stellt eine Modellierungsebene zur Verfügung, mit der verarbeitete Datennutzdaten deklarativ in native Cocoa-Objekte abgebildet werden. Dadurch kann der Anwendungsprogrammierer aufhören, sich mit dem Analysieren zu beschäftigen, und fordert das Framework einfach auf, eine Remote-Ressource asynchron abzurufen und den Delegaten mit den Ergebnissen aufzurufen. Die Objektzuordnung wird mithilfe der Schlüsselwertcodierung implementiert, sodass der analysierte Objektgraph schnell durchlaufen werden kann. Reflection wird für die Eigenschaftstypen verwendet, um die Zuordnung von Werten zu ermöglichen, die keine direkten Repräsentationen im Kodierungsformat enthalten, z. B. das Zuordnen von als String codierten JSON-Zeitmarken zu NSDate-Objekten.
  • Core Data-Unterstützung. RestKit baut auf der Objekt-Mapping-Schicht auf und bietet die Integration in das Core Data-Framework von Apple. Diese Unterstützung ermöglicht es RestKit, remote geladene Objekte direkt in einem lokalen Speicher zu speichern, entweder als schneller lokaler Cache oder als primärer Datenspeicher, der regelmäßig mit der Cloud synchronisiert wird. RestKit kann Core Data-Verknüpfungen für Sie auffüllen, wodurch ein auf natürlichen Eigenschaften basierendes Durchlaufen Ihres Datenmodells ermöglicht wird. Es bietet außerdem eine schöne API über die Kerndaten-Grundelemente, die die Konfiguration und das Abfragen von Anwendungsfällen vereinfacht.
  • Datenbank-Seeding Wenn der Core Data-Objektspeicher verwendet wird, können Sie eine Datenbank aus einer Sammlung von Datendateien starten. Auf diese Weise können Sie Ihre Apps mit einer Datenbank im App-Bundle an den App Store senden, die sofort einsatzbereit ist.
  • Steckbare Parsing-Schicht. RestKit unterstützt derzeit JSON über die Parser SBJSON und YAJL. Das Parsing wird hinter einer einfachen Schnittstelle implementiert, damit zusätzliche Datenformate transparent verarbeitet werden können.
  • Schienenintegration. Ursprünglich war RestKit als Objective-C-Antwort auf Active Resource konzipiert. Rails wurde als Backend für eine Reihe von iOS-Apps mit RestKit-Technologie verwendet. Die Interaktion mit einer Backs-Rails-Anwendung wird durch schlüsselfertige Unterstützung unterstützt.
  • Experimentelle Three20-Integration. RestKit wird häufig zusammen mit dem Three20-Framework verwendet. In der Distribution ist ein optionales Modul enthalten, mit dem RestKit über das TTModel-Protokoll mit Three20 verbunden werden kann.

Aufstehen und Laufen

RestKit ist als herunterladbares Binärpaket, als versionierter Snapshot oder als Git-Submodul verfügbar, wenn Sie die Mainline-Entwicklung verfolgen möchten. Für Benutzer der Bibliothek, die an der Entwicklung nicht interessiert sind, empfehlen wir die Verwendung der versionierten Binärpakete, um die Installation zu vereinfachen. Wenn Sie als Submodul installieren oder die Bibliothek selbst erstellen möchten, schlagen Sie in der Dokumentation von Github nach.

Sie können RestKit in wenigen einfachen Schritten installieren:

  1. Gehen Sie zu restkit.org und laden Sie die neueste Version (v0.9.0 zum Zeitpunkt des Schreibens) herunter..
  2. Entpacken Sie das Archiv an einer beliebigen Stelle, an der Sie Bibliotheken aufbewahren möchten (der Autor empfiehlt ein Bibliotheks-Unterverzeichnis).
  3. Ziehen Sie die RestKit.xcodeproj-Datei in Ihre Xcode-Projektdatei. Es wird dem hinzugefügt Gruppen & Dateien Abschnitt im linken Bereich des Projekts. Wählen Sie die entsprechenden Ziele aus und klicken Sie auf "Hinzufügen", wenn das Blatt angezeigt wird.
  4. Klicken Sie in Ihrem Projekt auf den Eintrag RestKit.xcodeproj Gruppen & Dateien Sektion. Suchen Sie im rechten Bereich die Einträge für libRestKitSupport.a, libRestKitObjectMapping.a, libRestKitNetwork.a, und libRestKitJSONParserYAJL.a Klicken Sie auf die Kontrollkästchen ganz rechts unter dem silbernen Zielsymbol. Dadurch wird Ihr Projekt mit RestKit verknüpft. Wenn Sie die Core Data-Unterstützung verwenden möchten, klicken Sie auf das Kontrollkästchen neben libRestKitCoreData.a ebenfalls. Ihr Projekt sollte in etwa wie der folgende Screenshot aussehen:
  5. Finden Sie das Ziel für Ihre Anwendung im Ziele Abschnitt Ihres Projekts. Klicken Sie mit der rechten Maustaste auf das Ziel Ihrer App und wählen Sie "Informationen" aus dem Menü aus, um das Informationsfenster des Zielinspektors zu öffnen.
  6. Sie sollten auf die schauen Allgemeines Registerkarte des Inspektors Ihres Ziels. In der Spitze Direkte Abhängigkeiten Klicken Sie im Abschnitt auf die Plus-Schaltfläche und fügen Sie eine direkte Abhängigkeit vom RestKit-Ziel hinzu.
  7. Nun schau nach unten Allgemeines Fenster beschriftet Verknüpfte Bibliotheken. Klicken Sie auf die Plus-Schaltfläche, um das Auswahlblatt für die Frameworks zu öffnen. Suchen und wählen Sie die folgenden Frameworks aus und klicken Sie auf "Hinzufügen":
    1. CFNetwork.framework - Erforderlich für die Netzwerkunterstützung.
    2. SystemConfiguration.framework - Erforderlich für die Erkennung der Netzwerkverfügbarkeit.
    3. MobileCoreServices.framework - Erforderlich. Unterstützt die automatische Erkennung des MIME-Typs für hochgeladene Dateien.
    4. CoreData.framework - Erforderlich. Erforderlich für die Verwendung des durch Core Data unterstützten persistenten Objektspeichers.
  8. Wechseln Sie in Ihrem Projektinspektor zur Registerkarte "Erstellen". Stellen Sie sicher, dass Ihre Aufbau Popup-Menü liest Alle Konfigurationen damit Ihre Änderungen für alle Build-Konfigurationen funktionieren.
  9. Finden Sie das Header-Suchpfade Rahmen. Doppelklicken Sie und fügen Sie einen neuen Eintrag hinzu. Wenn RestKit kompiliert wird, werden alle relevanten Header an die entsprechende Stelle im Verzeichnis / Build innerhalb der RestKit-Kasse kopiert. Sie müssen einen Pfad zum Verzeichnis / Build von RestKit hinzufügen, relativ zu Ihrer Projektdatei. Wenn Sie beispielsweise das Untermodul in das Unterverzeichnis 'Libraries' Ihres Projekts ausgecheckt haben, lautet der Headerpfad 'Libraries / RestKit / Build'..

    Jetzt finde die Andere Linker-Flags Rahmen. Doppelklicken Sie darauf und fügen Sie Einträge für hinzu -all_load und -ObjC. Ihre Einstellung sollte mit dem folgenden Screenshot übereinstimmen.

  10. Schließen Sie das Inspektorfenster.

Glückwunsch, Sie haben nun RestKit in Ihrem Projekt hinzugefügt!

Sie müssen jetzt nur noch Include-Dateien für die RestKit-Bibliotheken an den entsprechenden Stellen in Ihrer Anwendung hinzufügen. Die relevanten Includes sind:

#einführen  #einführen  // Wenn Sie Core Data verwenden? 

Erstellen Sie das Projekt, um sicherzustellen, dass alles ordnungsgemäß funktioniert.

Wenn Sie sich vergewissert haben, dass RestKit ordnungsgemäß in Ihr Projekt eingebunden ist, können Sie mit der Verwendung der Bibliothek beginnen.

RestKit verwenden

RestKit wurde entwickelt, um allgemeine Aufgaben so einfach und einfach wie möglich zu gestalten. In diesem Abschnitt werden wir viele allgemeine Aufgaben in der Bibliothek durchgehen und uns auf Codebeispiele konzentrieren, um Ihnen den Einstieg in die Bibliothek zu erleichtern.

Anfragen senden und Antworten bearbeiten

Die gesamte Funktionalität von RestKit basiert auf der Netzwerkschicht. Die Hauptverantwortung der Netzwerkschicht besteht in der Erstellung und Versendung von Anforderungen und der Verarbeitung von Antworten. Im Allgemeinen werden Sie alle Anforderungen über die RKClient-Klasse versenden.

RKClient ist ein Webclient-Objekt, das für die Kommunikation mit einem bestimmten Webserver konfiguriert ist. Es wird mit einer Basis-URL initialisiert und ermöglicht Ihnen das Festlegen einer Konfiguration, die den Anforderungen in Ihrer Anwendung gemeinsam ist, z. B. HTTP-Header und Authentifizierungsinformationen. Während Sie beliebig viele RKClient-Instanzen für Ihre Anwendung initialisieren können, gibt es eine gemeinsam genutzte Singleton-Instanz, die global verfügbar ist. Diese Singleton-Instanz wird häufig in den App-Delegaten konfiguriert applicationDidFinishLaunching: withOptions: Methode:

- (void) applicationDidFinishLaunching: (UIApplication *) - Anwendung withOptions: (NSDictionary *) - Optionen RKClient * client = [RKClient clientWithBaseURL: @ "http://restkit.org"];  

Der erste RKClient, der initialisiert wird, wird automatisch als Singleton-Instanz konfiguriert und ist über die SharedClient-Singleton-Methode verfügbar:

NSLog (@ "Ich bin dein RKClient-Singleton:% @", [RKClient sharedClient]); 

Nachdem Sie nun einen Client konfiguriert haben, können Sie HTTP-Anforderungen über den Client senden und verarbeiten. RestKit macht dies sehr einfach für Sie und abstrahiert die Low-Level-Details von NSURLConnection von Ihnen. Bei einer Anforderung über den Client geben Sie den Ressourcenpfad auf dem Remote-Webserver an, mit dem Sie interagieren möchten. Da die häufigste Aktion in einer iOS-Anwendung die asynchrone Anforderung an einen Remote-Webdienst ist, bietet RestKit sehr einfache Methoden für die HTTP-Verben: GET, POST, PUT und DELETE. Sie müssen nur erklären, dass Ihre Klasse das RKRequestDelegate-Protokoll implementiert, und dann eine Implementierung des bereitstellen request: didLoadResponse: Methode. Schauen wir uns ein Beispiel an, in dem die Grundlagen dargestellt werden:

#einführen  // Hier erklären wir, dass wir das RKRequestDelegate-Protokoll implementieren. // Überprüfen Sie RestKit / Network / RKRequest.h auf zusätzliche Delegatmethoden, // die verfügbar sind. @interface RKRequestExamples: NSObject   @end @implementation RKRequestExamples - (void) sendRequests // Führe einen einfachen HTTP-GET aus und rufe mich mit den Ergebnissen zurück [[RKClient sharedClient] get: @ "/ foo.xml" delegate: self]; // Einen POST an eine Remote-Ressource senden. Das Wörterbuch wird transparent // in eine URL-kodierte Darstellung konvertiert und als Anforderungshauptteil mitgeschickt. NSDictionary * params = [NSDictionary dictionaryWithObject: @ "RestKit" forKey: @ "Sender"]; [[RKClient sharedClient] post: @ "/ other.json" params: params delegate: self]; // DELETE einer Remote-Ressource vom Server [[RKClient-Client] delete: @ "/ missing_resource.txt" delegate: self];  - (void) request: (RKRequest *) request didLoadResponse: (RKResponse *) Antwort if ([request isGET]) // Behandlung von GET /foo.xml if ([antwort isOK]) // Erfolg! Schauen wir uns das Daten-NSLog an (@ "Retrieved XML:% @", [response bodyAsString]);  else if ([request isPOST]) // Umgang mit POST /other.json if ([Antwort ist JSON]) NSLog (@ "Ich habe eine JSON-Antwort von unserem POST zurück!");  else if ([request isDELETE]) // Umgang mit DELETE /missing_resource.txt if ([response isNotFound]) NSLog (@ "Der Ressourcenpfad '% @' wurde nicht gefunden.", [request resourcePath]);    @Ende 

Wie Sie sehen, ist der Code äußerst knapp und lesbar. Für RKRequest und RKResponse stehen eine Reihe von Hilfsmethoden zur Verfügung, die das Überprüfen Ihres Anforderungsstatus sehr einfach machen. Lesen Sie unbedingt die Kopfzeilen und machen Sie sich mit den verfügbaren Informationen vertraut.

Eine Einführung in die Objektzuordnung

Das Senden und Empfangen von HTTP-Anfragen ist einfach großartig, aber das ist nur die Spitze des Eisbergs. Die wirkliche Leistung von RestKit stammt nicht von der Netzwerkschicht, sondern von der Objektzuordnungsebene, die darüber liegt. Object Mapping ist die Lösung von RestKit zur Vereinfachung und DRY des übermäßig ausführlichen Arbeitsablaufs von:

  1. Senden einer Anforderung an einen Remote-Webdienst.
  2. Eine XML- oder JSON-Antwort zurückholen und analysieren.
  3. Nehmen Sie die geparste Antwort und weisen Sie die Werte innerhalb der Payload Objekten zu.

So wie RKClient Ihr Einstieg in ein einfacheres Leben mit HTTP ist, ist RKObjectManager Ihr Einstieg in die Welt des Objektmappings. Tatsächlich initialisieren Sie in Projekten, in denen die Objektzuordnung umfangreich verwendet wird, RKObjectManager anstelle von RKClient. So wie RKClient die winzigen Details der Abwicklung von Anforderungen abstrahieren möchte, versucht RKObjectManager, Sie vor der Komplexität der Umwandlung von Datennutzlasten in Objekte zu schützen.

Modellieren und Laden von Remote-Objekten

Für die Objektzuordnung müssen Sie eine Datenmodellklasse angeben, um Ihre Remote-Objekte darzustellen. Durch die Implementierung des RKObjectMappable-Protokolls konfigurieren Sie RestKit so, dass Attribute innerhalb einer abgerufenen Nutzlast den Eigenschaften Ihrer Modellklasse zugeordnet werden. Der Schlüssel zu diesem Prozess ist das elementToPropertyMappings Methode, die ein Wörterbuch mit Schlüsselpfaden und Eigenschaftsnamen definiert. Die Schlüsselpfade sind Zeichenketten, die mit der Schlüsselwertcodierung kompatibel sind, um auf Daten in einem geparsten Dokument zuzugreifen. Der Eigenschaftsname ist einfach der Zeichenfolgenname einer Eigenschaft in der Klasse, der die aufgerufenen Daten zugewiesen werden sollen.

Stellen Sie sich zur Veranschaulichung dieser Punkte vor, dass unsere Anwendung über ein einfaches Kontaktkonzept verfügt, das einen Namen, eine E-Mail-Adresse und eine Identifizierungsnummer enthält. Stellen wir uns vor, dass diese Platte auf unserem Remote-Server bei lebt / Kontakte / 1234. Die JSON sieht so aus:

'id': 1234, 'name': 'Blake Watters', 'company': 'Two Toasters' 

Lassen Sie uns eine RKObject-Klasse zusammenstellen, die diese Daten enthält:

@Interface-Kontakt: RKObject NSNumber * _identifier; NSString * _name; NSString * _company;  @ property (nonatomic, keep) NSNumber * Bezeichner; @ property (nonatomic, keep) NSString * name; @ Eigenschaft (nichtatomisch, behalten) NSString * -Gesellschaft; @Ende 

Jetzt müssen wir RestKit nur sagen, wie Daten von der Nutzlast zu unseren Immobilien zugeordnet werden sollen:

@implementation Contact - (NSDictionary *) elementToPropertyMappings return [NSDictionary dictionaryWithKeysAndObjects: @ "id", @ "bezeichner", @ "name", @ "name", @ "company", @ "company", nil];  @Ende 

Wir sind jetzt bereit, die Daten zu laden. Dazu richten wir den RKObjectManager ein und führen ein GET für den Datensatz aus. RKObjectManager erstellt und konfiguriert eine asynchrone RKObjectLoader-Anforderung für Sie und sendet sie zur Verarbeitung an den Remote-Server. Anstatt die Low-Level-RKRequestDelegate-Methoden zu implementieren, die sich mit Anforderungen und Antworten befassen, implementieren wir stattdessen das RKObjectLoaderDelegate-Protokoll und werden mit einer Sammlung von zugeordneten Objekten oder einem Fehler zurückgerufen. Schauen wir uns diesen Code an:

- (void) loadContact RKObjectManager * manager = [RKObjectManager objectManagerWithBaseURL: @ "http://restkit.org"]; [manager loadObjectsAtResourcePath: @ "/ contact / 1" objectClass: [Kontaktklasse] delegieren: selbst] // RKObjectLoaderDelegate-Methoden - (void) objectLoader: (RKObjectLoader *) objectLoader didLoadObjects: (NSArray *) Objekte Objekte objectAtIndex: 0]; NSLog (@ "Geladene Kontakt-ID #% @ -> Name:% @, Company:% @", contact.id, contact.name, contact.company);  - (void) objectLoader: (RKObjectLoader *) objectLoader didFailWithError: (NSError *) Fehler NSLog (@ "Fehler aufgetreten:% @", Fehler);  

Wie Sie sehen, ist der gesamte Prozess sehr niedrig und völlig trocken.

Routen einrichten

Das Laden von Objekten ist nur die halbe Geschichte. Um wirklich mit einem Remote-Webdienst interagieren zu können, müssen Sie auch Remote-Objektinstanzen erstellen, aktualisieren und löschen können. Ein Störfaktor bei diesen Interaktionen ist häufig, dass der Ressourcenpfad, unter dem sich ein Objekt befindet, für jede Instanz spezifisch ist. Stellen Sie sich vor, dass die gesamte Kontaktwelt durch die folgenden Paare von HTTP-Verben und Ressourcenpfaden dargestellt wird:

  • GET / Kontakte gibt alle Kontakte als Sammlung zurück
  • POST / Kontakte erstellt einen neuen Kontakt
  • GET / Kontakte / gibt bestimmte Kontaktdetails zurück
  • PUT / Kontakte / aktualisiert vorhandene Kontaktdetails
  • LÖSCHEN / Kontakte / löscht einen vorhandenen Kontakt

Um zu vermeiden, dass Code mit diesen Konventionen und Ressourcenpfaden verschwendet wird, bietet RestKit ein Routing-System, das Ressourcenpfade für ein Objekt generieren kann. Routing ist als erweiterbares System konzipiert, das Flexibilität bietet, RestKit wird jedoch mit einer sehr leistungsfähigen Implementierung in der RKDynamicRouter-Klasse ausgeliefert. Das Routing wird aktiviert, indem dem RKObjectManager eine Instanz eines Objekts, das das RKRouter-Protokoll implementiert, zugewiesen und der Router entsprechend konfiguriert wird. Schauen wir uns eine Beispielkonfiguration mit RKDynamicRouter und unser Kontaktbeispiel an:

RKDynamicRouter * router = [RKDynamicRouter neu]; // Definiere einen Standardressourcenpfad für alle nicht angegebenen HTTP-Verben [Router routeClass: [Kontaktklasse] toResourcePath: @ "/ Contacts / (Bezeichner)"]; [Router routeClass: [Kontaktklasse] toResourcePath: @ "/ contact" forMethod: RKRequestMethodPOST]; [RKObjectManager sharedManager] .router = Router; 

Der bemerkenswerte Teil der Konfiguration ist die Verwendung von Klammern im Ressourcenpfad für die Standardroute. Innerhalb der Klammern können Sie eine beliebige Instanzmethode für die zu konfigurierende Klasse angeben. Wenn RestKit einen Ressourcenpfad für dieses Objekt generiert, wird der zurückgegebene Wert in die Zeichenfolge interpoliert.

In unserem obigen Beispiel können Sie sehen, dass die Operationen GET, PUT und DELETE / contact / 1234 generieren, während der POST / contact generiert.

Remote-Objekte bearbeiten

Nachdem wir das Routing konfiguriert haben, können Sie die Darstellung entfernter Objekte auf einer sehr hohen Ebene bearbeiten. Schauen wir uns etwas mehr Code an und gehen wir durch den Prozess:

- (void) createObject Contact * joeBlow = [Kontaktobjekt]; joeBlow.name = @ "Joe Blow"; joeBlow.company = @ "Zwei Toaster"; // POST an / Kontakte [[RKObjectManager sharedManager] postObject: joeBlow delegate: self];  - (void) updateObject Contact * blake = [Kontaktobjekt]; blake.identifier = [NSNumber numberWithInt: 1]; blake.name = @ "Blake Watters"; blake.company = @ "RestKit"; // PUT an / Kontakte / 1 [[RKObjectManager sharedManager] putObject: blake delegate: self];  - (void) deleteObject Contact * blake = [Kontaktobjekt]; blake.identififer = [NSNumber numberWithInt: 1]; // DELETE to / contact / 1 [[RKObjectManager sharedManager] deleteObject: blake delegate: self];  

Was wir hier gemacht haben, ist die kombinierte Kraft der Objektzuordnung und des Routings, um sehr umfangreiche Manipulationen an lokalen und fernen Objekten durchzuführen. Hinter den Kulissen hat RestKit den geeigneten Ressourcenpfad für Ihren Vorgang ermittelt, eine asynchrone Anforderung erstellt und gesendet und die Antwort für Sie verarbeitet.

Überprüfung der Schlüsselkonzepte

  • Client- und Objektmanager. Für die Arbeit mit RestKit in Ihrer Anwendung gibt es zwei primäre Einstiegspunkte: RKClient und RKObjectManager. RKClient ist der primäre Einstiegspunkt, wenn Sie mit der Netzwerkschicht von RestKit arbeiten, und befasst sich mit den untergeordneten Details zum Erstellen und Senden von Anforderungen. RKObjectManager arbeitet auf einer höheren Abstraktionsebene in der Objektzuordnungsebene und beschäftigt sich mit dem Laden und Bearbeiten von Objekten, die ferne Ressourcen darstellen. Je nachdem, was Sie mit RestKit erreichen möchten, arbeiten Sie intensiv mit einer (oder beiden!) Dieser Klassen.

  • Basis-URLs und Ressourcenpfade. RestKit verwendet die Konzepte "Basis-URL" und "Ressourcenpfad", um den Zugriff auf Remote-Objektdarstellungen zu koordinieren. Die Basis-URL ist einfach der gemeinsame Teil aller URLs Ihrer Remote-Anwendung und wird zum Initialisieren von Instanzen der Klassen RKClient und RKObjectManager verwendet. Ein Ressourcenpfad ist einfach der Pfad (oder Unterpfad) der vollständigen URL zu einer HTTP-Ressource. Wenn ein RKClient-Objekt mit "http://restkit.org" initialisiert wurde und der Inhalt unter dem Ressourcenpfad "/foo/bar.json" abgerufen wird, erstellt RestKit eine Anforderung und sendet diese an "http://restkit.org" /foo/bar.json '. Dadurch können Sie Entwicklungs-, Staging- und Produktionsumgebungen in Ihren Anwendungen problemlos unterstützen, indem Sie verschiedene Basis-URLs bedingt zusammenstellen. Die meiste Zeit werden Sie vollständig in Bezug auf Ressourcenpfade denken, nachdem Sie die Initialisierung der Bibliothek abgeschlossen haben.

Beispiel:

RKClient * client = [RKClient clientWithBaseURL: @ "http: ///restkit.org"]; [client get: @ "/ foo / bar.json" delegate: self]; 
  • Objektzuordnung. Wenn Sie mit RestKit Remote-Ressourcen in lokale Objekte modellieren, interagieren Sie mit der Objektzuordnungsebene. Bei der Objektzuordnung wird eine entfernte JSON-Nutzlast (oder ein anderes Drahtformat) verwendet, in ein Diagramm mit NSObjects für die Schlüsselwertcodierung geparst und ein Satz von Zuordnungsregeln angewendet, um Werte innerhalb des analysierten Objektdiagramms in Attribute eines Modells umzuwandeln Objekt. RestKit unterstützt erweitertes Mapping über das hinaus, was Sie durch einfaches Dekodieren einer Payload erhalten, z. B. das Analysieren einer Zeichenfolge, die ein Datum enthält, in eine NSDate-Eigenschaft und den Zugriff auf Daten über Schlüsselwertcodierungsoperatoren. Objektzuordnungsregeln werden durch Implementieren von konfiguriert elementToPropertyMappings Methode der RKObjectMappable Protokoll:

Beispiel:

@implementation MyObject // Ordnen Sie full_name und street_adddress in JSON-Payload // lokalen Eigenschaften fullName und streetAddress + (NSDictionary *) elementToPropertyMappings return [NSDictionary dictionaryWithKeysAndObjects: @ "full_name", @ "streetName", @ "streetAddress" zu ", null];  @Ende 
  • Routing. Das Routingsystem ist dafür verantwortlich, Ressourcenpfade aus lokalen Objektinstanzen zu generieren. Auf diese Weise können Sie Ihre lokalen Objekte mit ihren Remote-Repräsentationen bearbeiten und synchronisieren, ohne eine URL zu sehen. Das Routingsystem ist durch die Bereitstellung einer eigenen Implementierung des RKRouter-Protokolls erweiterbar, RestKit wird jedoch mit einer leistungsfähigen Implementierung in der RKDynamicRouter-Klasse ausgeliefert. Mit dem dynamischen Router können Sie Eigenschaftennamen in einfachen Zeichenfolgen codieren, um zur Laufzeit komplexe Ressourcenpfade zu generieren. Dies wird am besten anhand einiger Beispiele verstanden:

Beispiel:

RKObjectManager * manager = [RKObjectManager objectManagerWithBaseURL: @ "http://restkit.org"]; RKDynamicRouter * router = [[RKDynamicRouter new] Autorelease]; manager.router = Router; // POST-Anforderungen für Artikel-Instanzen an '/ articles' senden [Router routeClass: [Artikelklasse] toResourcePath: @ "/ articles" forMethod: RKRequestMethodPOST]; // Konfigurieren Sie einen Standardressourcenpfad für Artikel. Senden von GET-, PUT- und DELETE-Anforderungen an '/ articles / XXXX' // articleID ist eine Eigenschaft in der Article-Klasse [router routeClass: [Article-Klasse] toResourcePath: @ "/ articles / (articleID)"]; // Kommentare zum Artikel konfigurieren. Senden Sie den POST von Comment-Objekten an '/ articles / 1234 / comments' //, wenn der Kommentar eine Beziehung zu einem Artikel hat. [Router routeClass: [Kommentarklasse] toResourcePath: @ "/ articles / (article.articleID) / comments" forMethod: RKRequestMethodPOST]; // Erstellen Sie einen Artikel Article * article = [Article object]; article.title = @ "Foo"; article.body = @ "Dies ist der Körper"; // Einen POST an / articles senden, um die Remote-Instanz zu erstellen [[RKObjectManager sharedManager] postObject: article delegate: self]; // Jetzt erstellen wir einen Kommentar zum Artikel Kommentar * comment = [Comment object]; comment.article = Artikel; comment.body = @ "Dies ist der Kommentar!"; // Wenn der Artikel eine ID von 1234 hat, sendet er einen POST an / articles / 1234 / comments, um den Kommentar zu erstellen [[RKObjectManager sharedManager] postObject: comment delegate: self]; // den Artikel löschen DELETE to / articles / 1234 [[RKObjectManager sharedManager] deleteObject: Kommentar Delegat: Eigen]; 

Fazit

In diesem Artikel wurden die Grundlagen der Arbeit mit RestKit erläutert. Sie sollten sich jetzt mit den Kernkonzepten auskennen und sich darauf vorbereiten, Ihre nächste RESTful iOS-App zu entwickeln. Wie bereits im einleitenden Abschnitt erwähnt, enthält RestKit auch einige erweiterte Funktionen, die in diesem Artikel nicht behandelt wurden. Die fortgeschrittenen Teile der Bibliothek, einschließlich der Kerndaten, werden in unserem kommenden fortgeschrittenen Lernprogramm ausführlich erläutert. Bis dahin können Sie mehr über den in der Bibliothek enthaltenen Beispielcode und die nachfolgenden Ressourcen erfahren.

Mehr lernen

  • RestKit.org
  • Github-Projektseite
  • Offizielle Google-Gruppe
  • Zwei Toaster