Die*_*ros 9 objective-c ios restkit restkit-0.20
我有一个情况,我正在做一个对象的帖子(不是托管的,只是一个NSObject派生的),但REST API的响应不是被发布的对象类型的JSON表示.这完全是另一回事.有可能处理这个吗?
假设我发布了一个对象(JSON):
{
"prop1" : 123,
"prop2" : 5
}
Run Code Online (Sandbox Code Playgroud)
并且响应如果不是具有属性的对象,prop1并且prop2正如默认情况下RestKit所期望的那样,而是其他内容:
{
"data" : [1,2,3,4,5,6],
"message" : "hello world"
}
Run Code Online (Sandbox Code Playgroud)
我已经看到了将operation.targetObject设置为nil的示例,但(我相信)这只是在Core Data托管方案中.
我正在尝试这样简单的事情:
RKObjectRequestOperation *operation = [self.objectManager appropriateObjectRequestOperationWithObject:body method:RKRequestMethodPOST path:@"items" parameters:nil];
[operation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *result) {
// success is called, but the result does not contain what the response JSON is
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
// failure
}];
[operation setWillMapDeserializedResponseBlock:^id(id deserializedResponseBody) {
// deserializedResponseBody is always nil
}];
[operation start];
Run Code Online (Sandbox Code Playgroud)
我以为我能够查看setWillMapDeserializedResponseBlock中的响应内容,但它总是为零.
由于发布对象有prop1和prop2性能,以及RestKit是如何工作的默认情况下,预计JSON与所述属性.但是,由于结果与发布的对象无关,prop1并且prop2只是零(我无论如何都不关心).
顺便说一句,我已经正确设置了请求映射,因此body传入操作对象正确映射我的NSObject并将其以正确的JSON格式发送到服务器.
有没有办法让我可以用RestKit进行这样的调用,并在成功事件中手动拉出我要找的东西?即使它是JSON响应的字典表示?
Jon*_*kas 16
我只是为您的响应创建一个新对象,并将您的响应映射到该响应.
@interface MYRequest : NSObject
@property NSNumber *prop1;
@property NSNumber *prop2;
@end
@interface MYResponse : NSObject
@property NSArray *data;
@property NSString *message;
@end
Run Code Online (Sandbox Code Playgroud)
RKObjectMapping *requestMapping = [RKObjectMapping requestMapping];
[requestMapping addAttributeMappingsFromArray:@[@"prop1", @"prop2"]];
RKObjectMapping *responseMapping = [RKObjectMapping mappingForClass:[MYResponse class]];
[requestMapping addAttributeMappingsFromArray:@[@"data", @"message"]];
Run Code Online (Sandbox Code Playgroud)
RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:requestMapping
objectClass:[MYRequest class]
rootKeyPath:nil
method:RKRequestMethodPOST];
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:responseMapping
method:RKRequestMethodPOST
pathPattern:@"items"
keyPath:nil
statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
Run Code Online (Sandbox Code Playgroud)
[self.objectManager addRequestDescriptor:requestDescriptor];
[self.objectManager addResponseDescriptor:responseDescriptor];
Run Code Online (Sandbox Code Playgroud)
MYRequest *body = [MYRequest new];
[body setProp1:@123];
[body setProp2:@5];
[self.objectManager postObject:body
path:@"items"
parameters:nil
success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
MYResponse *result = [mappingResult firstObject];
NSLog(@"Data: %@\nMessage: %@", [result data], [result message]);
}
failure:^(RKObjectRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
Run Code Online (Sandbox Code Playgroud)