1

クラス 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 によるフレーム キャプチャ

Wireshark を使用したフレーム キャプチャ

良さそうですね..よくわかりません。

4

1 に答える 1