iOS:RestKit loadObject&send params

Alo*_*mir 8 parameters objective-c ios restkit

在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];
    }];
Run Code Online (Sandbox Code Playgroud)

最终的url请求不包括"?param1 = val"部分 - 为什么?

Dam*_* Aw 15

稍后更新月份

真正的答案是loader.params创建HTTP BODY,因此它适用于POST, PUT, DELETE等,但不适用于GETparams附加到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

} ];
Run Code Online (Sandbox Code Playgroud)

警告Emptor(以上)

在块中设置params会破坏您可能已设置的任何映射,这会破坏yourObject使用对象映射的目的.Sebastian loader.params这里有一个解决方法 -如果你真的想使用这个方法将额外的参数附加到你的Post而不是在对象中,那么这是一个额外的参数.

以params形式发送为查询字符串(即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];
Run Code Online (Sandbox Code Playgroud)

答案的其余部分仅供参考,我是一个囤积者.


老答案

我正在将RestKit用于我的项目并面临同样的问题.

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

我这样做了

App代理中的加载方法

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

[[RKClient sharedClient] get:@"/api/v1/shops.json" queryParams:shopParams delegate:self];
Run Code Online (Sandbox Code Playgroud)

代表

- (void)requestDidStartLoad:(RKRequest *)request {
    NSLog(@"RK Request description: %@",[request description]);
}
Run Code Online (Sandbox Code Playgroud)

输出: RK Request description: <RKRequest: 0x7993db0>和rails log说{"limit"=>"30"}.

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

我的目标是附加一个查询字符串,即?location=singapore&etcetc我在Rails中的API方法.为此,RK附带了一个NSString名为appendQueryParams RK docs链接的插件,可用于附加查询参数.

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

更新:

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

 NSDictionary *shopParams = [NSDictionary dictionaryWithKeysAndObjects:
                                @"limit",@"20", 
                                @"location",@"latitude,longitude",
                                nil];
Run Code Online (Sandbox Code Playgroud)

这已过时并标记为弃用.


 [[RKObjectManager sharedManager] loadObjectsAtResourcePath:[@"/api/v1/shops.json" appendQueryParams:shopParams] delegate:self];
Run Code Online (Sandbox Code Playgroud)

请改用:

 [[RKObjectManager sharedManager] loadObjectsAtResourcePath:[@"/api/v1/shops.json stringByAppendingQueryParameters:shopParams] delegate:yourLoaderDelegate];
Run Code Online (Sandbox Code Playgroud)

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

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

请参阅此问题RestKit GET查询参数.