iOS:RestKit 加载对象和发送参数

Posted

技术标签:

【中文标题】iOS:RestKit 加载对象和发送参数【英文标题】:iOS: RestKit loadObject & send params 【发布时间】:2012-02-22 21:07:16 【问题描述】:

在 GET 方法上使用 loadObjectAtResourcePath,请求中不包含我的参数。

例如,如果我发送:

[RKObjectManager objectManagerWithBaseURL:@"http://something/ws"];
    [[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"/res" delegate:self block:^(RKObjectLoader *loader) 
        NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
                              @"val", @"param1",
                              nil];
        loader.params = [RKParams paramsWithDictionary:dict];
    ];

最终的 url 请求不包含“?param1=val”部分 - 为什么?

【问题讨论】:

【参考方案1】:

几个月后更新

真正的答案是loader.params 创建了HTTP BODY,因此它适用于POST, PUT, DELETE 等,但不适用于GET,其中参数附加到URL。

因此,如果您遇到GET 的相同问题,以下答案仍然有效,但如果您发送GET 请求,则主要使用将参数附加到查询字符串的方法。

总结一下两者的区别。

在 HTTP 正文中发送参数(即POST, UPDATE, DELETE

// Convert a NS Dictionary into Params
RKParams *params = [RKParams paramsWithDictionary:optionValues];

// I use sendObject to skip the router. Otherwise it's normally postObject
[[RKObjectManager sharedManager] sendObject:yourObject toResourcePath: yourResourcePath usingBlock:^(RKObjectLoader *loader) 
    loader.method = RKRequestMethodPOST;
    loader.delegate = delegate;
    loader.params = params; // This sets params in the POST body and discards your yourObject mapping

 ];

注意事项(以上)

在块中设置参数会破坏您可能在yourObject 中设置的任何映射,这有点违背了使用对象映射的目的。 Sebastian loader.params - Extra params 在这里提供了一个修复,如果您真的想使用此方法将额外参数附加到您的 Post 而不是对象中。

以查询字符串的形式发送参数(即GET

// Make a NS dictionary and use stringByAppendingQueryParameters
NSDictionary *shopParams = [NSDictionary dictionaryWithKeysAndObjects:
                                @"limit",@"20", 
                                @"location",@"latitude,longitude",
                                nil];

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:[@"/api/v1/shops.json" stringByAppendingQueryParameters:shopParams] delegate:objectDelegate];

其余答案仅供参考,我是囤积者。


旧答案

我在我的项目中使用 RestKit 并面临同样的问题。

我认为RKParams主要是用来做POST的请求。我无法完全破译您的代码,因为 1) 我不知道 loader 的声明? 2)RKParams不能和Object Manager一起使用?

我做到了。

App Delegate 中的加载器方法

NSDictionary *shopParams = [NSDictionary dictionaryWithKeysAndObjects:@"limit",@"30", nil]; 

[[RKClient sharedClient] get:@"/api/v1/shops.json" queryParams:shopParams delegate:self];

委托

- (void)requestDidStartLoad:(RKRequest *)request 
    NSLog(@"RK Request description: %@",[request description]);

输出RK Request description: <RKRequest: 0x7993db0> 和 rails 日志说 "limit"=>"30"

从 Xcode 的自动完成功能中,您可以看到 get 请求甚至没有使用 RKParams。只是一个NSDict。 POST 请求使用它。

我的目标是将查询字符串(即?location=singapore&etcetc)附加到我在 Rails 中的 API 方法中。为此,RK 附带了一个名为 appendQueryParams RK docs link 的 NSString 插件,您可以使用它来附加查询参数。

如果你的目标是POST图片等,你可以按照上面的思路使用RKClient

更新:

如果您只想将参数附加到对象管理器

 NSDictionary *shopParams = [NSDictionary dictionaryWithKeysAndObjects:
                                @"limit",@"20", 
                                @"location",@"latitude,longitude",
                                nil];

这已过时并标记为弃用。


 [[RKObjectManager sharedManager] loadObjectsAtResourcePath:[@"/api/v1/shops.json" appendQueryParams:shopParams] delegate:self];

改用这个:

 [[RKObjectManager sharedManager] loadObjectsAtResourcePath:[@"/api/v1/shops.json stringByAppendingQueryParameters:shopParams] delegate:yourLoaderDelegate];

Rails 日志"location"=>"latitude,longitude", "limit"=>"20"

希望我的回答没有做出任何错误的陈述。

参考这个问题RestKit GET query parameters。

【讨论】:

最终我也是这么做的。但是我确实想使用对象管理器来使用 RestKit 的映射功能。 @daemonsy 非常感谢。我一直在用头撞它一段时间。 @drewish 谢谢。每当有人觉得这很有用时,我都会尝试将其更新得更彻底。

以上是关于iOS:RestKit 加载对象和发送参数的主要内容,如果未能解决你的问题,请参考以下文章

RestKit 加载对象

如何打印 Restkit (IOS) 发送的正文

如何使用 Restkit 和 Core Data 存储对象和种子预加载数据

RESTKit 对象 BOOL 属性为真/假 JSON

如何使用 RestKit 加载多个不相关的对象?

除了 Restkit,iOS 上的简单 Restful 框架/客户端?