我尝试使用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 进行帧捕获
这似乎是好的..我不明白。