1

REST API で ID リクエストによる検索を実行しようとしています。RestKit 0.20 を使用しています。Location オブジェクトがあります。id 属性があります。「/locations/:id」に GET リクエストを送信し、完全なオブジェクトを JSON として受け取りたいと考えています。バックエンドがあり、動作しています。現在、iOS クライアント コードを作成しようとしています。

ここに私が持っているものがあります:

RKObjectManager* m = [RKObjectManager sharedManager];

RKObjectMapping* lmap = [RKObjectMapping requestMapping];
[lmap addAttributeMappingsFromArray:@[@"id"]];
RKRequestDescriptor* req = [RKRequestDescriptor requestDescriptorWithMapping:lmap objectClass:[Location class] rootKeyPath:nil];
[m addRequestDescriptor:req];

Location* l = [[Location alloc] init];
l.id = [NSNumber numberWithInt:177];
[m getObject:l path:@"locations/:id" parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
    NSLog(@"LOADED: %@", [mappingResult firstObject]);
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
    NSLog(@"FAILED");
}];

上記のコードを実行した後、Restkit はパスの ':id: を Location オブジェクトに設定された ID 属性に置き換えません。

私が間違っていることについて何か考えがありますか?

アップデート:

Location クラスには、要求記述子と応答記述子の両方を設定しました。find_by_id リクエスト用にルートを追加しましたが、それはクラス ルートではなく名前付きルートでした。getObject:path:parameters:success:failure メソッドを使用すると、ルーターは「id」プレースホルダーを埋めませんでした (名前が「id」、「object_id」、「identity」などであるかどうかに関係なく)。

私が見つけた解決策はこれです:

  1. 名前付きルートを引き続き使用しますが、代わりに getObjectsAtPathForRouteNamed:object:parameters:success:failure メソッドを使用します
  2. Class Route を使用し、引き続き getObject:path:parameters:success:failure メソッドを使用します

私が抱えていた問題は、次のように NamedRoute を使用する場合でした。

RKRoute * route = [RKRoute routeWithClass:className pathPattern:path method:RKRequestMethodFromString(method)];
[objectManager.router.routeSet addRoute:route];

getObject:path:parameters:success:failure メソッドを使用してオブジェクトをクエリしても、ルーターは URL パスのプレースホルダーを埋めませんでした。

4

1 に答える 1

5

リクエスト記述子を使用していますが、「リクエスト」(PUT / POST) を行っていません。GET を実行するときは、応答記述子を使用する必要があります。また、作成しているマッピングはクラスを指定していません(したがって、 に対してリンクされていNSDictionaryます。通常、ルーターでも応答記述子を使用します。次のようなもの:

RKObjectManager* m = [RKObjectManager sharedManager];

RKObjectMapping* lmap = [RKObjectMapping mappingForClass:[Location class]];
[lmap addAttributeMappingsFromArray:@[@"identity"]];

RKResponseDescriptor* req = [RKResponseDescriptor responseDescriptorWithMapping:lmap pathPattern:@"locations/:identity" keyPath:nil statusCodes:[NSIndexSet indexSetWithIndex:200]];
[m addResponseDescriptor:req];

[m.router.routeSet addRoute:[RKRoute routeWithClass:[Location class] pathPattern:@"locations/:identity" method:RKRequestMethodGET]];

Location* l = [[Location alloc] init];
l.identity = [NSNumber numberWithInt:177];

[m getObject:l path:nil parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
    NSLog(@"LOADED: %@", [mappingResult array]);
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
    NSLog(@"FAILED");
}];
于 2013-05-01T08:06:23.577 に答える