在阅读文档和发布对象的示例代码时,我一定错过了与序列化实体相关的内容。似乎可以将实体发送到postObject并期望它使用提供的映射来生成JSON并将其发布到服务器。
我已经能够映射和发布一个对象,但是JSON并没有很好地形成。
我已经能够手动参数化对象并获得有效的JSON。我即将深入研究源代码,但想知道我错过了什么。
这是我看到的代码和结果。洞察/帮助表示赞赏!
我有以下托管对象:
@interface TFUser : NSManagedObject
@property (nonatomic, retain) NSString * first_name;
@property (nonatomic, retain) NSString * last_name;
@end
我有以下代码来映射它:
+(RKEntityMapping *) mapping
{
if (_mapping == nil)
{
RKObjectManager *objectManager = [RKObjectManager sharedManager];
assert(objectManager && "Object manager not initialized!?");
RKManagedObjectStore *managedObjectStore = objectManager.managedObjectStore;
assert(objectManager && "No object store!?");
// USER Entity Map
_mapping = [RKEntityMapping mappingForEntityForName:@"TFUser"
inManagedObjectStore:managedObjectStore];
[_mapping addAttributeMappingsFromDictionary:@{
@"first_name": @"first_name",
@"last_name": @"last_name"
}];
_mapping.identificationAttributes = @[ @"first_name" ];
}
return _mapping;
}
我有以下代码来测试直接序列化一个受管对象:
TFUser *user = (TFUser*) [self.managedObjectContext insertNewObjectForEntityForName:@"TFUser"];
user.first_name = @"Mickey";
user.last_name = @"Mouse";
NSError *error;
RKRequestDescriptor *requestDescriptor =
[RKRequestDescriptor requestDescriptorWithMapping:[TFUser.mapping inverseMapping]
objectClass:[TFUser class]
rootKeyPath:@"user"
method:RKRequestMethodAny];
NSDictionary *parameters = [RKObjectParameterization parametersWithObject:user
requestDescriptor:requestDescriptor
error:&error];
NSData *jsonData= [RKMIMETypeSerialization dataFromObject:parameters MIMEType:RKMIMETypeJSON error:&error];
NSString *message = [[NSString alloc] initWithData:jsonData encoding:NSASCIIStringEncoding];
NSLog(@"USER JSON:\r\n%@", message);
这产生了我所期望的:
USER JSON:
{
"user" : {
"first_name" : "Mickey",
"last_name" : "Mouse"
}
}
当我直接postObject对象时:
[[RKObjectManager sharedManager] postObject:user
path:@"/user"
parameters:nil
success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
NSLog(@"Success");
}
failure:^(RKObjectRequestOperation *operation, NSError *error) {
NSLog(@"Error");
}];
服务器收到:
{ user: { first_name: 'Mickey', last_name: 'Mouse' } }
解析器抱怨它无法处理JSON。
为什么我会得到不同的结果?如何让帖子为服务器生成正确的JSON?
谢谢! - 凯文
答案 0 :(得分:0)
代码一直在工作。调试和服务器上的一些代码被破坏了。
通过仔细检查发送到服务器的正文请求的日志记录,很明显JSON格式良好,离开了客户端。这是:
request.headers={
Accept = "application/json";
"Accept-Language" = "en;q=1, fr;q=0.9, de;q=0.8, zh-Hans;q=0.7, zh-Hant;q=0.6, ja;q=0.5";
"Content-Type" = "application/json; charset=utf-8";
"User-Agent" = "Treefort/1.0 (iPhone Simulator; iOS 7.0.3; Scale/2.00)";
}
request.body={
"user" : {
"first_name" : "Mickey",
"last_name" : "Mouse"
}
}
服务器上的代码是这样做的:
console.log req.body
request = JSON.parse req.body
user = request.user
JSON在到达此处时已经被处理为对象。这意味着日志行将对象转储到日志,而不是接收到的正文的文本。第二个问题是没有理由明确请求正文的JSON解析。它已被转换为对象。
要解决此问题,我只需将代码更改为:
user = req.body.user
有时别人说...它应该有效。几天来,我一直在喋喋不休。谢谢!