始终调用RestKit didFailWithError,didLoadObjects从不调用

时间:2011-12-13 20:34:49

标签: restkit

嗯,标题几乎说明了一切。我正在调用我的服务器,当它超过或失败时,它调用我的didFailWithError方法,从不调用我的didLoadObjects方法。我本来期望调用didFailWithError,比如说,我得到401回来了,当我得到200回来时会调用didLoadObjects。

以下是我设置对象映射的方法:

- (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; 
}

以下是我发布到服务器的方式。

- (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];
}

在didFailWithError中,我检查:

if ([response statusCode] >= 400) {

看我是否成功,这看起来真的,真的,错了。

我在这里做错了什么?当我运行示例代码时,我确实看到didLoadObjects被调用。

以下是2次运行的日志,第一次失败,第二次失败:

在这里,我们可以看到我尝试创建一个名为“andrew”的用户,但其中一个已经存在。我得到了406并且调用了didFailWithError。

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: foo@example.com
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'.

在这里,我们可以看到我尝试创建名为“andrewA”的用户并创建用户。我得到22回来并调用didFailWithError,而不是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: fooA@example.com
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

请注意,在这两种情况下,我都从服务器返回非JSON响应,但它只是一个字符串,如错误消息或激活码。

1 个答案:

答案 0 :(得分:2)

您将Content-type标头设置为“application/json”,并且响应不是格式正确的JSON。我相信由于解析问题导致映射过程失效。您可以尝试修改服务器输出,例如,返回JSON或设置适当的内容类型标题。