RestKit 0.20.0 - 带有 JSON HTTP 正文请求的 getObjectsAtPath
Posted
技术标签:
【中文标题】RestKit 0.20.0 - 带有 JSON HTTP 正文请求的 getObjectsAtPath【英文标题】:RestKit 0.20.0 - getObjectsAtPath with JSON HTTP Body request 【发布时间】:2012-12-12 17:27:27 【问题描述】:我在RestKit 0.10.x 版本中使用
[[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"/special/path" usingBlock:^(RKObjectLoader *loader)
loader.objectMapping = aMapping;
loader.delegate = _delegate;
loader.method = RKRequestMethodPOST;
loader.userData = [MobileGatewayReauthentication class];
loader.params = [anDictionary toJsonRKParam];
];
将NSDictionary
添加到loader.params
以将参数集合作为请求的HTTP 正文发送。
从 RestKit 0.20.0 开始,方法 loadObjectsAtResourcePath
已被以下方法替换,其中不再可能在 parameters
中传递 NSDictionary
,它用作 HTTP 正文(JSON 编码):
[RKObjectManager.sharedManager getObjectsAtPath:path parameters:params success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult)
NSLog(@"success");
failure:^(RKObjectRequestOperation *operation, NSError *error)
NSLog(@"failure");
];
当使用[[RKObjectManager sharedManager].HTTPClient
(AFNetworking) 时,它在设置时就像一个魅力:
[[RKObjectManager sharedManager].HTTPClient setParameterEncoding:AFJSONParameterEncoding];
[[RKObjectManager sharedManager].HTTPClient postPath:path parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject)
NSLog(@"Response: %@", operation.responseString);
failure:^(AFHTTPRequestOperation *operation, NSError *error)
NSLog(@"Error: %@",error.localizedDescription);
];
但我需要更高级别的对象映射器。
[[RKObjectManager sharedManager].HTTPClient setParameterEncoding:AFJSONParameterEncoding];
对 [RKObjectManager sharedManager] 没有影响,但是
[[RKObjectManager sharedManager].HTTPClient setDefaultHeader:@"aHeader" value:@"aValue"];
有。所以我假设setParameterEncoding
也有效。
这是一个错误,是尚未实现,还是我遗漏了什么?
非常感谢。
【问题讨论】:
【参考方案1】:我真的错过了什么。
loadObjectsAtResourcePath
得到(肯定)用RKRequestMethodGET
调用。所以参数会附加到 URL,而不是 HTTP 正文。
要将参数附加为 JSON HTTP 正文,您必须使用 post 方法,例如
- (void)postObject:(id)object
path:(NSString *)path
parameters:(NSDictionary *)parameters
success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success
failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure;
请原谅这个仓促的问题。我应该早就看过了。
【讨论】:
【参考方案2】:如果我正确理解了您的问题,RestKit 创建者会在开发分支中推送一些内容(始终经过测试并且使用起来非常安全),这可能会解决您的问题 (Commit here),默认情况下基本上设置为:
[[RKObjectManager sharedManager].HTTPClient setDefaultHeader:@"Accept" value:RKMIMETypeJSON];
[[RKObjectManager sharedManager].HTTPClient registerHTTPOperationClass:[AFJSONRequestOperation class]];
希望对您有所帮助!
【讨论】:
我拉取了最新的开发分支提交,但是没有用。我已编辑问题以阐明我的需求。【参考方案3】:getObjectsAtPath:path 中的 path 可能有问题 如果您在路径的开头使用斜杠 (/),请将其移至 baseurl 的末尾,如下例所示。
NSURL *baseURL = [NSURL URLWithString:@"http://rest.example.com:8080/test/"];
AFHTTPClient* client = [[AFHTTPClient alloc] initWithBaseURL:baseURL];
[objectManager getObjectsAtPath:@"rest/updates"
parameters:nil
success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult)
NSLog(@"success");
failure:^(RKObjectRequestOperation *operation, NSError *error)
NSLog(@"failure");
];
【讨论】:
以上是关于RestKit 0.20.0 - 带有 JSON HTTP 正文请求的 getObjectsAtPath的主要内容,如果未能解决你的问题,请参考以下文章
Restkit 版本 0.20.0-pre2。 : 问题:post object 中没有键。如何发布?
Restkit 0.20.rc 需要但不包含多个 0.10 项