Restkit - 发布对象

时间:2013-09-11 13:55:33

标签: ios http-post restkit restkit-0.20

我尝试使用方法发布一个对象 Foobar (该类有两个属性: string foo string bar )类RKObjectManager的postObject

服务器端,我有一个接收POST方法的WCF服务

public void PostFoobar(Foobar foobar) { ... }

所有连接都有效。问题是收到的对象foobar总是NULL。似乎ResKit没有POST我的对象作为两个参数的封装,但是独立地发布两个字符串。

我的意思是,当我尝试实现以下方法(服务器端)时:

public void PostFoobar(string foo, string bar) { ... }

并且这两个参数不为空!它有效! 但我宁愿显然恢复序列化对象......

我的问题是:

我怎么想配置我的POST请求来恢复服务器端的整个Foobar对象,而不是每个属性都独立?

我的代码

这是我发送POST请求的代码

NSError *error = nil;
NSManagedObjectModel *managedObjectModel = @"myObjecModel";
RKManagedObjectStore *managedObjectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:managedObjectModel];

[managedObjectStore createPersistentStoreCoordinator];

NSPersistentStore __unused *persistentStore = [managedObjectStore addInMemoryPersistentStore:&error];
NSAssert(persistentStore, @"Failed to add persistent store: %@", error);

[managedObjectStore createManagedObjectContexts];
managedObjectStore.managedObjectCache = [[RKInMemoryManagedObjectCache alloc] initWithManagedObjectContext:managedObjectStore.persistentStoreManagedObjectContext];

[RKManagedObjectStore setDefaultStore:managedObjectStore];

// Configure the object manager
RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:@"http://192.168.1.10/rest"]];
objectManager.managedObjectStore = managedObjectStore;
objectManager.requestSerializationMIMEType = RKMIMETypeJSON;
[objectManager setAcceptHeaderWithMIMEType:RKMIMETypeJSON];
[RKObjectManager setSharedManager:objectManager];
[RKMIMETypeSerialization registerClass:[RKNSJSONSerialization class] forMIMEType:@"text/plain"];

RKEntityMapping *postMapping = [RKEntityMapping mappingForEntityForName:@"Foobar" inManagedObjectStore:managedObjectStore];
[postMapping addAttributeMappingsFromDictionary:@{
 @"foo" : @"strFoo",  // server side:foo, iOS side: strFoo
 @"bar" : @"strBar"   // server side:bar, iOS side: strBar
 }];
RKRequestDescriptor * requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:[postMapping inverseMapping] objectClass:[Foobar class] rootKeyPath:nil method:RKRequestMethodPOST];
[objectManager addRequestDescriptor:requestDescriptor];

// POST to create
RKManagedObjectStore *objectStore = [[RKObjectManager sharedManager] managedObjectStore];
Foobar *foobar = [NSEntityDescription insertNewObjectForEntityForName:@"Foobar" inManagedObjectContext:objectStore.mainQueueManagedObjectContext];
foobar.strFoo = @"foo ipad";
foobar.strBar = @"bar ipad";

@try {
    [[RKObjectManager sharedManager] postObject:foobar path:@"foobar" parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
        NSLog(@"Success");
    } failure:^(RKObjectRequestOperation *operation, NSError *error) {
        NSLog(@"Failure: %@", error.localizedDescription);
    }];
}
@catch (NSException *exception) {
    NSLog(@"error - %@", exception);
}

还有一件事:

我使用Chrome客户端“ Simle REST客户端”测试了我的网络服务,它可以处理数据:

{ "foo": "foo from chrome", "bar" : "bar from chrome" }

编辑 - 使用Wireshark进行帧捕获

frame capture with wireshark

这似乎很好......我不明白。

1 个答案:

答案 0 :(得分:0)

您正在使用nil

进行通话
[[RKObjectManager sharedManager] postObject:nil path:@"foobar" parameters:nil ...

所以RestKit没有任何序列化和参数。

如果这是一个拼写错误,请启用跟踪日志记录以进行映射并查看它正在执行的操作。此外,获取Charles或类似工具,并确切地检查通过网络发送的数据。