如何使用 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 访问下一页