当前位置: 动力学知识库 > 问答 > 编程问答 >

RestKit didFailWithError always called, didLoadObjects never called

问题描述:

Well, the title pretty much says it all. I'm calling my server and when it suceeds or fails it calls my didFailWithError method, never calling my didLoadObjects method. I would have expected didFailWithError to be called when, say, I get a 401 back, and didLoadObjects to be called when I get a 200 back.

Here's how I set up my object mapping:

- (void)setupCreateAccountMapping

{

// mapping for CreateAccount

RKObjectMapping* createAccountSerializationMapping = [RKObjectMapping mappingForClass:[CreateAccount class]];

[createAccountSerializationMapping mapAttributes:@"email", @"pwd", @"uname", nil];

[[RKObjectManager sharedManager].mappingProvider setSerializationMapping:createAccountSerializationMapping forClass:[CreateAccount class]];

// mapping for CheckUserName

RKObjectMapping* checkUserNameSerializationMapping = [RKObjectMapping mappingForClass:[CheckUserName class]];

[checkUserNameSerializationMapping mapAttributes:@"uname", nil];

[[RKObjectManager sharedManager].mappingProvider setSerializationMapping:checkUserNameSerializationMapping forClass:[CheckUserName class]];

router = [RKObjectRouter new] ;

[router routeClass:[CheckUserName class] toResourcePath:@"/registration/rest/users/isavailable" forMethod:RKRequestMethodGET];

[router routeClass:[CreateAccount class] toResourcePath:@"/registration/rest/users/create_account" forMethod:RKRequestMethodPOST];

[RKObjectManager sharedManager].router = router;

}

and here is how I post to the server.

- (IBAction)submitPressed:(id)sender {

CreateAccount* user = [CreateAccount new];

user.email = [emailAddressTextField text];

user.uname = [usernameTextField text];

user.pwd = [passwordTextField text];

[[RKObjectManager sharedManager] postObject:user delegate:self];

}

In didFailWithError I check:

if ([response statusCode] >= 400) {

to see if I succeeded or not and that seems really, really, wrong.

What am I doing wrong here? When I run the sample code I do see didLoadObjects called.

Here is the log from 2 runs, the first unsuccessful and the second successful:

Here we can see me trying to create a user named "andrew" but one already exists. I get a 406 back and didFailWithError is called.

2011-12-14 10:52:33.376 Ferret[60007:f803] D restkit.network:RKClient.m:389 Reachability to host '127.0.0.1' determined for client <RKClient: 0x900c9d0>, unsuspending queue <RKRequestQueue: 0x900eee0 name=(null) suspended=YES requestCount=0 loadingCount=0/5>

Current language: auto; currently objective-c

2011-12-14 10:53:16.478 Ferret[60007:f803] D restkit.network:RKRequest.m:362 Sending asynchronous POST request to URL http://127.0.0.1:8080/registration/rest/users/create_account.

2011-12-14 10:53:16.478 Ferret[60007:f803] D restkit.network:RKObjectLoader.m:302 POST or PUT request for source object <CreateAccount: 0x6d1d8e0>, serializing to MIME Type application/x-www-form-urlencoded for transport...

2011-12-14 10:53:16.479 Ferret[60007:f803] D restkit.object_mapping:RKObjectMappingOperation.m:509 Starting mapping operation...

2011-12-14 10:53:16.479 Ferret[60007:f803] T restkit.object_mapping:RKObjectMappingOperation.m:510 Performing mapping operation: RKObjectMappingOperation for '__NSCFDictionary' object. Mapping values from object <CreateAccount: 0x6d1d8e0> to object {

} with object mapping RKObjectMapping class => CreateAccount: keyPath mappings => (

"RKObjectKeyPathMapping: pwd => pwd",

"RKObjectKeyPathMapping: uname => uname",

"RKObjectKeyPathMapping: email => email"

)

2011-12-14 10:53:16.479 Ferret[60007:f803] T restkit.object_mapping:RKObjectMappingOperation.m:263 Mapping attribute value keyPath 'pwd' to 'pwd'

2011-12-14 10:53:16.479 Ferret[60007:f803] D restkit.object_mapping:RKObjectPropertyInspector.m:107 Cached property names and types for Class 'CreateAccount': {

accessibilityHint = NSString;

accessibilityLabel = NSString;

accessibilityLanguage = NSString;

accessibilityValue = NSString;

email = NSString;

pwd = NSString;

uname = NSString;

}

2011-12-14 10:53:16.482 Ferret[60007:f803] T restkit.object_mapping:RKObjectMappingOperation.m:273 Mapped attribute value from keyPath 'pwd' to 'pwd'. Value: 123456

2011-12-14 10:53:16.483 Ferret[60007:f803] T restkit.object_mapping:RKObjectMappingOperation.m:263 Mapping attribute value keyPath 'uname' to 'uname'

2011-12-14 10:53:16.483 Ferret[60007:f803] T restkit.object_mapping:RKObjectMappingOperation.m:273 Mapped attribute value from keyPath 'uname' to 'uname'. Value: andrew

2011-12-14 10:53:16.483 Ferret[60007:f803] T restkit.object_mapping:RKObjectMappingOperation.m:263 Mapping attribute value keyPath 'email' to 'email'

2011-12-14 10:53:16.483 Ferret[60007:f803] T restkit.object_mapping:RKObjectMappingOperation.m:273 Mapped attribute value from keyPath 'email' to 'email'. Value: [email protected]

2011-12-14 10:53:16.483 Ferret[60007:f803] D restkit.object_mapping:RKObjectMappingOperation.m:516 Finished mapping operation successfully...

2011-12-14 10:53:16.484 Ferret[60007:f803] T restkit.network:RKRequest.m:310 Prepared POST URLRequest '<NSMutableURLRequest http://127.0.0.1:8080/registration/rest/users/create_account>'. HTTP Headers: {

Accept = "application/json";

"Content-Type" = "application/x-www-form-urlencoded";

}. HTTP Body: pwd=123456&uname=andrew&email=foo%40example.com.

2011-12-14 10:53:16.572 Ferret[60007:f803] D restkit.network:RKResponse.m:196 NSHTTPURLResponse Status Code: 406

2011-12-14 10:53:16.573 Ferret[60007:f803] D restkit.network:RKResponse.m:197 Headers: {

"Content-Length" = 32;

"Content-Type" = "application/json";

Date = "Wed, 14 Dec 2011 15:53:14 GMT";

Server = "Apache-Coyote/1.1";

}

2011-12-14 10:53:16.573 Ferret[60007:f803] T restkit.network:RKResponse.m:202 Read response body: UserName or Email must be unique

2011-12-14 10:53:16.573 Ferret[60007:f803] E restkit.network:RKObjectLoader.m:289 Encountered an error while attempting to map server side errors from payload: Unexpected token, wanted '{', '}', '[', ']', ',', ':', 'true', 'false', 'null', '"STRING"', 'NUMBER'.

Here we can see me trying to create a user named "andrewA" and the user is created. I get a 22 back and didFailWithError is called, not didLoadObjects

2011-12-14 10:54:21.486 Ferret[60007:f803] D restkit.network:RKRequest.m:362 Sending asynchronous POST request to URL http://127.0.0.1:8080/registration/rest/users/create_account.

2011-12-14 10:54:21.486 Ferret[60007:f803] D restkit.network:RKObjectLoader.m:302 POST or PUT request for source object <CreateAccount: 0x9041300>, serializing to MIME Type application/x-www-form-urlencoded for transport...

2011-12-14 10:54:21.486 Ferret[60007:f803] D restkit.object_mapping:RKObjectMappingOperation.m:509 Starting mapping operation...

2011-12-14 10:54:21.486 Ferret[60007:f803] T restkit.object_mapping:RKObjectMappingOperation.m:510 Performing mapping operation: RKObjectMappingOperation for '__NSCFDictionary' object. Mapping values from object <CreateAccount: 0x9041300> to object {

} with object mapping RKObjectMapping class => CreateAccount: keyPath mappings => (

"RKObjectKeyPathMapping: pwd => pwd",

"RKObjectKeyPathMapping: uname => uname",

"RKObjectKeyPathMapping: email => email"

)

2011-12-14 10:54:21.486 Ferret[60007:f803] T restkit.object_mapping:RKObjectMappingOperation.m:263 Mapping attribute value keyPath 'pwd' to 'pwd'

2011-12-14 10:54:21.486 Ferret[60007:f803] T restkit.object_mapping:RKObjectMappingOperation.m:273 Mapped attribute value from keyPath 'pwd' to 'pwd'. Value: 123456

2011-12-14 10:54:21.494 Ferret[60007:f803] T restkit.object_mapping:RKObjectMappingOperation.m:263 Mapping attribute value keyPath 'uname' to 'uname'

2011-12-14 10:54:21.494 Ferret[60007:f803] T restkit.object_mapping:RKObjectMappingOperation.m:273 Mapped attribute value from keyPath 'uname' to 'uname'. Value: andrewA

2011-12-14 10:54:21.494 Ferret[60007:f803] T restkit.object_mapping:RKObjectMappingOperation.m:263 Mapping attribute value keyPath 'email' to 'email'

2011-12-14 10:54:21.494 Ferret[60007:f803] T restkit.object_mapping:RKObjectMappingOperation.m:273 Mapped attribute value from keyPath 'email' to 'email'. Value: [email protected]

2011-12-14 10:54:21.494 Ferret[60007:f803] D restkit.object_mapping:RKObjectMappingOperation.m:516 Finished mapping operation successfully...

2011-12-14 10:54:21.495 Ferret[60007:f803] T restkit.network:RKRequest.m:310 Prepared POST URLRequest '<NSMutableURLRequest http://127.0.0.1:8080/registration/rest/users/create_account>'. HTTP Headers: {

Accept = "application/json";

"Content-Type" = "application/x-www-form-urlencoded";

}. HTTP Body: pwd=123456&uname=andrewA&email=fooA%40example.com.

2011-12-14 10:54:23.004 Ferret[60007:f803] D restkit.network:RKResponse.m:196 NSHTTPURLResponse Status Code: 200

2011-12-14 10:54:23.004 Ferret[60007:f803] D restkit.network:RKResponse.m:197 Headers: {

"Content-Length" = 45;

"Content-Type" = "application/json";

Date = "Wed, 14 Dec 2011 15:54:20 GMT";

Server = "Apache-Coyote/1.1";

"X-Powered-By" = "Servlet/3.0; JBossAS-6";

}

2011-12-14 10:54:23.004 Ferret[60007:f803] T restkit.network:RKResponse.m:202 Read response body: 98a454470b8b1cf0d3e081f3e2ac2ca41323878059558

2011-12-14 10:54:23.016 Ferret[60007:1531b] D restkit.network:RKObjectLoader.m:214 No object mapping provider, using mapping provider from parent object manager to perform KVC mapping

Notice in both cases I'm getting a non-JSON response back from the server, but it is just a string, like the error message or the activation code.

网友答案:

You have your Content-type header set to "application/json" and the response is not a well-formed JSON. I believe the mapping process bails out due to the parsing problem. You can try modifying the server output eg.return a JSON or to set appropriate content type header.

分享给朋友:
您可能感兴趣的文章:
随机阅读: