POST 后无法映射接收到的对象

Posted

技术标签:

【中文标题】POST 后无法映射接收到的对象【英文标题】:Can't map received object after a POST 【发布时间】:2016-02-20 10:58:58 【问题描述】:

向服务器发出 POST 请求后,返回的对象是不可映射的,尽管我已经为它创建了所有必要的基础架构。

为了简化我的问题,我创建了一个“POST 对象”类,另一个用于响应对象; (以下是我的代码的重要部分)

JSON

请求

 
    "USERNAME" : 280S808D08s,
    "PASSWORD" : "lkjl123kjl",
    "DEVICE" : 12345

回应


    "firstname": "first name here",
    "lastname": "last name here",
    "mobile": "012938012839",
    "email": "john@smith.com",
    "expiry": "2016-05",
    "authorized": true

这是我的“POST 对象”类实现

@interface Login : NSObject

@property NSString *USERNAME;
@property NSString *PASSWORD;
@property NSString *DEVICE;

@end

这些是 API 方法;

RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[Login class]];
[mapping addAttributeMappingsFromArray:@[@"USERNAME", @"PASSWORD",@"DEVICE"]];

RKRequestDescriptor *loginRequest = [RKRequestDescriptor
                                     requestDescriptorWithMapping:[mapping inverseMapping]
                                     objectClass:[Login class]
                                     rootKeyPath:nil
                                     method:RKRequestMethodPOST];

实际请求

[objectManager addRequestDescriptor:loginRequest];

// POST
Login* loginUser = [Login new];
loginUser.USERNAME = @"96150001505233";
loginUser.PASSWORD = @"gb168362";
loginUser.DEVICE = @"12345";

[[RKObjectManager sharedManager] postObject:loginUser
                                       path:@"/app_dev.php/api/v2/user/login"
                                 parameters:nil
                                    success:^(RKObjectRequestOperation  *operation, RKMappingResult *mappingResult) 
                                     failure:^(RKObjectRequestOperation *operation, NSError *error) 
                                    ];

现在是“接收对象”的类

@interface User : NSObject

@property NSString *firstname;
@property NSString *lastname;
@property NSString *email;
@property NSString *mobile;

@end

API 方法:

RKObjectMapping *userMap = [RKObjectMapping mappingForClass:[User class]];
[userMap addAttributeMappingsFromArray:@[ @"firstname", @"lastname", @"email", @"mobile"]];

RKResponseDescriptor *userResponse = [RKResponseDescriptor
                                      responseDescriptorWithMapping:userMap
                                      method:RKRequestMethodPOST
                                      pathPattern:@"user/login"
                                      keyPath:nil
                                      statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];

[objectManager addResponseDescriptor: userResponse];

错误

我已经将它整齐地隔开以使其更具可读性。

错误域=org.restkit.RestKit.ErrorDomain Code=1001 "没有响应 描述符与加载的响应相匹配。”

UserInfo=NSLocalizedFailureReason=从 URL 'http://mywebsite.com/app_dev.php/api/v2/user/login',失败 匹配所有 (0) 个响应描述符:,

NSErrorFailingURLStringKey=http://mywebsite.com/app_dev.php/api/v2/user/login,

NSErrorFailingURLKey=http://mywebsite.com/app_dev.php/api/v2/user/login,

NSUnderlyingError=0x7fee81d59440 错误 Domain=org.restkit.RestKit.ErrorDomain Code=1001 "没有可映射的对象 在搜索的关键路径中找到了表示。”

UserInfo=NSLocalizedDescription=没有可映射的对象表示 在搜索的关键路径中找到。,

NSLocalizedFailureReason=映射操作找不到任何 搜索到的关键路径上的嵌套对象表示: 发现输入到映射器的表示包含嵌套 以下关键路径的对象表示:授权、电子邮件、 到期、名字、姓氏、手机

这可能表明您错误配置了 你的映射。,keyPath=null,DetailedErrors=(),keyPath=null, NSLocalizedDescription=没有响应描述符匹配响应 已加载。

请帮忙:(

【问题讨论】:

【参考方案1】:

你有两个问题:

    您发出的请求的路径模式与响应描述符不匹配 发布特定对象时,响应会映射到同一个对象,因此您应该为整个事物使用一个对象或从字典中发布

【讨论】:

感谢您的建议。但事实证明我只需要修改我的 POST 请求的 keyPath,并使其匹配 @"user/login"。保持其他一切不变,现在可以正常工作了! :)【参考方案2】:

解决方案相当简单。对于 POST 请求,我的 keyPath 错误。只需将其修改为此;

[[RKObjectManager sharedManager] postObject:loginUser
                                       path:@"user/login"
                                 parameters:nil
                                    success:^(RKObjectRequestOperation  *operation, RKMappingResult *mappingResult) 
                                     failure:^(RKObjectRequestOperation *operation, NSError *error) 
                                    ];

【讨论】:

以上是关于POST 后无法映射接收到的对象的主要内容,如果未能解决你的问题,请参考以下文章

RestKit 对象映射 - 一个实体,两个映射

尝试在 React 中映射子对象时出现未定义错误

POST方法提交请求时,List类型映射失败

无法在 asp.net mvc 4 中将 JSON 对象映射到 JqGrid

RestKit 对象映射 POST 响应,“CoreData:错误:在 NSManagedObject 类映射操作上调用指定初始化程序失败”

RestKit 不喜欢为 POST 响应映射不同的对象