1

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

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

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

所有连接都有效。问题是接收到的对象 foobar 始终为 NULL。似乎 ResKit 不会将我的对象作为两个参数的封装发布,而是独立发布两个字符串。

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

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 客户端”测试了我的 Web 服务,它适用于数据:

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

编辑 - 使用 Wireshark 进行帧捕获

使用wireshark进行帧捕获

这似乎是好的..我不明白。

4

1 回答 1

0

你打电话给nil

[[RKObjectManager sharedManager] postObject:nil path:@"foobar" parameters:nil ...

所以 RestKit 没有被序列化,也没有参数。

如果这是一个错字,请为映射打开跟踪日志并查看它在做什么。此外,获取 Charles 或类似工具,并准确检查通过网络发送的数据。

于 2013-09-11T14:31:36.820 回答