0

Restkit を使用してオブジェクトを POST しようとしていますが、追加のパラメーターを設定すると、オブジェクトが投稿されなくなります。

NSDictionary *params = [NSDictionary dictionaryWithObject:@"mic" forKey:@"type"];

    [[RKObjectManager sharedManager] sendObject:rating toResourcePath:@"/mic" usingBlock:^(RKObjectLoader *loader) {
        loader.delegate = self;
        loader.method = RKRequestMethodPOST;
        loader.params = params; // without this line, the 'rating' object is posted, 
    }];

オブジェクトに含まれていない追加の POST パラメータを送信する必要があります。上記のコードでは、POST を介して追加の「タイプ」パラメータを受け取りますが、オブジェクトは受信されません。

ドキュメントのパラメーターセクションを読みましたhttps://github.com/RestKit/RestKit/wiki/Object-mapping - メソッドが変更されたため、ドキュメントは少し古いはずですが、概念は同じです。私が間違っていることはわかりません...助けていただければ幸いです。

4

2 に答える 2

3

RestKit のソースで「prepareURLRequest」を検索します

最初の行は次のとおりです。

    if ((self.sourceObject && self.params == nil) && (self.method == RKRequestMethodPOST || self.method == RKRequestMethodPUT))

したがって、sourceObject は有効ですが、params は nil ではないため、オブジェクトがシリアル化されることはありません。

また、オブジェクトが正常にシリアライズされると、「params」値に入れられます。したがって、「loader.params = params」と言うと、最初のオブジェクトが上書きされます。

ここでの最善の解決策は、「sourceObject」を変更して、追加のパラメーターが含まれるようにし、それに応じてマッピングを作成することです。

それ以外では、より一般的なメソッド (loadObject を参照) を使用し、ブロック内でメソッドを「POST」に変更し、post-data ブロックを手動でビルドする必要がある場合があります。

于 2012-09-04T13:32:19.763 に答える
1

私は解決策を見つけました、それは少し長い時間がかかります。なぜなら、使用するとき、sendObjectそしてloadObject残念ながら、メソッドはあなたが送信しているものと同じオブジェクトを返すことを前提としているからです。同じオブジェクトまたはエラーオブジェクトが返されるため、これは私には当てはまりません。これが私がやった方法です

RKObjectManager *manager = [RKObjectManager sharedManager];
    [manager loadObjectsAtResourcePath:@"/mic" usingBlock:^(RKObjectLoader *loader) {
        loader.delegate = self;
        loader.method = RKRequestMethodPOST;
        NSError* error;
        RKObjectMapping* serializationMapping = [manager.mappingProvider serializationMappingForClass:[Rating class]];
        RKObjectSerializer* serializer = [RKObjectSerializer serializerWithObject:rating mapping:serializationMapping];
        id params = [serializer serializationForMIMEType:manager.serializationMIMEType error:&error];

        if (error) {
            NSLog(@"Error serializing object");
        }

        NSLog(@"Params class: %@", [params class]);

        if ([params respondsToSelector:@selector(setValue:forKey:)])
            [params performSelector:@selector(setValue:forKey:) withObject:@"mic" withObject:@"type"];

        loader.params = params;
    }];

ブロック内のオブジェクトをシリアル化し、結果の辞書にパラメーターを追加しました。そうすれば、オブジェクトに追加の「タイプ」プロパティを指定する必要はありません...つまり、投稿する予定のすべてのオブジェクトにそれを追加する必要があります。

于 2012-09-04T14:20:50.880 に答える