Как запросить вложенные ресурсы с помощью RESTkit для Objective-C - PullRequest
4 голосов
/ 31 января 2012

У меня есть чистый API RESTful, который предоставляет мне следующие конечные точки

/ поставщики
/ Поставщики /: ID / страны
/ vendors /: id / страны /: id / города

Я неопытен, когда дело доходит до Objective-C и RESTkit. Сейчас я ищу способ сопоставить объекты на стороне сервера с 3 классами на стороне клиента: поставщик, страна, город.

Так что я ожидаю объявления для каждого класса,

a) определяет конечную точку, в которую можно получить объекты JSON
б) определяет отношения 1: n от поставщика к стране и от страны к городу.

После этого я ожидал, что смогу сделать что-то подобное [псевдокод]:

vendors = Vendors.all //retrieve all vendors and construct objects
countries = vendors[0].countries  //retrieve all countries of the first vendor
city = countries.last.cities //retrieve the cities of the last countries

К сожалению, я не вижу ничего подобного в RESTkit. Чтобы иметь возможность создавать отношения между объектами, API должен предоставлять вложенные ресурсы! Например, вызов конечной точке страны должен был бы доставить связанный объект поставщика непосредственно в страны JSON?!?

Это то, чего я совсем не понимаю. В этом случае я бы использовал все виды устаревших протоколов и не должен был использовать RESTful API.

Я что-то пропускаю? Может кто-нибудь помочь в этой теме или предоставить ссылку на ресурс, объясняющий RESTkit более подробно, чем документы?

Ответы [ 2 ]

0 голосов
/ 01 апреля 2013

В документации RestKit есть раздел: «Сопоставление без KVC», который покрывает это.

RKPathMatcher: средство сопоставления путей оценивает шаблоны URL-адресов для получения совпадений с такими шаблонами, как '/ article /: articleID', которыйбудет совпадать с '/ article / 1234' или '/articles/some-great-article'.

https://github.com/RestKit/RestKit/wiki/Object-mapping#mapping-without-kvc

Примечание: я еще не пробовал, ноДокумент обновлен до последней версии RestKit (0.20.0)

0 голосов
/ 07 февраля 2012

Отвечая на ваш вопрос, да, вы можете определить отношения, используя RestKit, и представление JSON должно быть вложено, прочитайте его, чтобы увидеть пример этого и как отобразить его на ваших объектах.

Вы должны выполнить следующие действия:

  1. Создайте свои объекты, используя свойства, которые вы получаете от API.

  2. Вам необходимо установить сопоставления, связанные с каждым из ваших объектов и JSON / XML, который вы получаете от API.

  3. Определите сопоставления между вашими объектами, если свойство объекта является другим объектом.

Из документации по сопоставлению объектов :

Необходимо проанализировать следующий JSON:

{ "articles": [
    { "title": "RestKit Object Mapping Intro",
      "body": "This article details how to use RestKit object mapping...",
      "author": {
          "name": "Blake Watters",
          "email": "blake@restkit.org"
      },
      "publication_date": "7/4/2011"
    }]
}

Определите ваши объекты в Objective-C:

//author.h
@interface Author : NSObject
    @property (nonatomic, retain) NSString* name;
    @property (nonatomic, retain) NSString* email;
@end

//article.h
@interface Article : NSObject
    @property (nonatomic, retain) NSString* title;
    @property (nonatomic, retain) NSString* body;
    @property (nonatomic, retain) Author* author; //Here we use the author object!
    @property (nonatomic, retain) NSDate*   publicationDate;
@end

Установить сопоставления:

// Create our new Author mapping
RKObjectMapping* authorMapping = [RKObjectMapping mappingForClass:[Author class]];
// NOTE: When your source and destination key paths are symmetrical, you can use mapAttributes: as a shortcut
[authorMapping mapAttributes:@"name", @"email", nil];

// Now configure the Article mapping
RKObjectMapping* articleMapping = [RKObjectMapping mappingForClass:[Article class]];
[articleMapping mapKeyPath:@"title" toAttribute:@"title"];
[articleMapping mapKeyPath:@"body" toAttribute:@"body"];
[articleMapping mapKeyPath:@"author" toAttribute:@"author"];
[articleMapping mapKeyPath:@"publication_date" toAttribute:@"publicationDate"];

// Define the relationship mapping
[articleMapping mapKeyPath:@"author" toRelationship:@"author" withMapping:authorMapping];

[[RKObjectManager sharedManager].mappingProvider setMapping:articleMapping forKeyPath:@"articles"];

Надеюсь, это вам пригодится!

...