クラス RKObjectManagerのメソッドpostObjectを使用して、オブジェクトFoobar (クラスには文字列 fooと文字列 barの 2 つの属性があります)を投稿しようとしました。
サーバー側には、POST メソッドを受け取る WCF サービスがあります
public void PostFoobar(Foobar foobar) { ... }
すべての接続が機能します。問題は、受信したオブジェクト foobar が常に NULL であることです。ResKit は、オブジェクトを 2 つの引数のカプセル化として POST するのではなく、2 つの文字列を個別に投稿するようです。
つまり、次のメソッド(サーバー側)を実装しようとしたとき:
public void PostFoobar(string foo, string bar) { ... }
2 つのパラメーターが null ではありませんでした。それはうまくいきました!しかし、シリアル化されたオブジェクトを明らかに回復したいと思います...
私の質問は:
すべての属性を個別にではなく、サーバー側で Foobar オブジェクト全体を回復するように POST 要求を構成するにはどうすればよいですか?
私のコード
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 によるフレーム キャプチャ
良さそうですね..よくわかりません。