如何使用 REST kit for Objective-C 请求嵌套资源

Posted

技术标签:

【中文标题】如何使用 REST kit for Objective-C 请求嵌套资源【英文标题】:Howto request nested resources using RESTkit for Objective-C 【发布时间】:2012-01-31 10:57:04 【问题描述】:

我有一个干净的 RESTful API,它为我提供了以下端点

/供应商 /vendors/:id/国家 /vendors/:id/countries/:id/cities

我对 Objective-C 和 RESTkit 缺乏经验。目前我正在寻找一种将服务器端对象映射到客户端的 3 个类的方法:供应商、国家/地区、城市。

所以我希望每个类都有一个声明

a) 定义可以获取 JSON 对象的端点 b) 定义从供应商到国家以及从国家到城市的 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 的资源的链接吗?

【问题讨论】:

【参考方案1】:

RestKit 文档有一个部分:Mapping without KVC 涵盖了这一点。

RKPathMatcher:路径匹配器评估 URL 模式以生成 匹配诸如“/articles/:articleID”之​​类的模式,这将 匹配“/articles/1234”或“/articles/some-great-article”。

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

注意:我还没有尝试过,但文档似乎已更新为最新版本的 RestKit (0.20.0)

【讨论】:

【参考方案2】:

回答您的问题,是的,您可以使用 RestKit 定义关系,并且 JSON 表示需要嵌套,请继续阅读以查看此示例以及如何将其映射到您的对象上。

您必须按照以下步骤操作:

    使用从 API 获得的属性创建对象。

    您需要设置与每个对象关联的映射 以及您从 API 获得的 JSON/XML。

    如果一个对象的属性是另一个对象,则定义对象之间的映射。

来自Object Mapping Documentation:

需要解析以下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"];

希望对你有用!

【讨论】:

问题是关于交付嵌套资源,而不是关于映射。

以上是关于如何使用 REST kit for Objective-C 请求嵌套资源的主要内容,如果未能解决你的问题,请参考以下文章

Binary Rejected for import the Health kit 但未实施/使用

Binary Rejected for import the Health kit 但未实施/使用

Account Kit (for Web) Server Error - 我们遇到了一个错误

如何使用 JIRA -REST-API for python 访问下一页

当使用 Spring MVC for REST 时,如何让 Jackson 漂亮地打印呈现的 JSON?

Sprite Kit,使多个精灵遵循相同的方法