私はしばらくの間 RestKit 0.10.0 を使用してきましたが、この時点までは、シリアル化されたオブジェクトのみをサーバーに投稿しました。
[[RKObjectManager sharedManager] postObject:serializedObject
usingBlock:^(RKObjectLoader *loader) {
loader.delegate = self;
loader.objectMapping = responseMapping;
loader.serializationMIMEType = RKMIMETypeFormURLEncoded;
loader.targetObject = nil;
}];
ここまでは順調ですね。しかし、いくつかのクエリ パラメータを使用してサーバーに GET リクエストを送信する必要があります。最初に頭に浮かんだ自然なことは、私がオブジェクトを投稿したときと同じことをすることでした:
- クエリ パラメータをカプセル化するオブジェクトのシリアル化マッピングを作成する
- サーバーから受信するオブジェクトの応答マッピングを作成する
- (RKRequestMethodPOST の代わりに) RKRequestMethodGET 用のルーターを定義して使用する
- (postObject:usingBlock の代わりに) getObject:usingBlock を使用してリクエストを行います。
私はすぐにこれがそれを行う方法ではないことがわかったので、利用可能なリソース ( RestKit Wiki、RestKit Google グループ) を検索した後、有効と見なされる 2 つの解決策を知っています。
- クエリ パラメーターをリソース パスに追加します。
これは完全に機能します。
NSDictionary *queryParams = [NSDictionary dictionaryWithObjectsAndKeys:
token, @"accessToken",
[NSNumber numberWithInt:level], @"level",
[NSNumber numberWithInt:count], @"count",
nil];
NSString* resourcePath = [PEER_SUGGESTIONS_CONTROLLER_PATH stringByAppendingQueryParameters:queryParams];
[[RKObjectManager sharedManager] loadObjectsAtResourcePath:resourcePath
usingBlock:^(RKObjectLoader *loader) {
loader.delegate = self;
loader.objectMapping = responseMapping;
}];
- ローダー ブロックでクエリ パラメータを設定します。
これはクエリ パラメータを送信しません。
RKParams *params = [RKParams params];
[params setValue:token forParam:@"accessToken"];
[params setValue:[NSNumber numberWithInt:level] forParam:@"level"];
[params setValue:[NSNumber numberWithInt:count] forParam:@"count"];
[[RKObjectManager sharedManager] loadObjectsAtResourcePath:PEER_SUGGESTIONS_CONTROLLER_PATH
usingBlock:^(RKObjectLoader *loader) {
loader.delegate = self;
loader.objectMapping = responseMapping;
loader.params = params;
}];
私の質問は次のとおりです。
- 2 番目のソリューションが機能しないのはなぜですか?
- JSON 応答にルート キー パスがないにもかかわらず、最初のソリューションが loader.targetObject を nil に設定しなくても機能するのはなぜですか?
- getObject:usingBlock メソッドを使用する必要があるのはどのような場合ですか? その意図された目的は何ですか?
- loader.params は何に使用すればよいですか? ウィキのオブジェクト マッピング チュートリアルでは、このプロパティを使用して POST パラメーターをカプセル化できると述べていますが、メソッド postObject:usingBlock で送信されるシリアル化されたオブジェクトにパラメーターをラップできるため、ポイントがわかりません。
ありがとう。
[後で編集]
2 番目の質問への回答について: POST リクエストを作成するときに、ローダー ブロックで targetObject を nil に設定しています。そうしないと、RestKit が応答に send オブジェクト マッピングを使用しようとするためです (関連する議論については、このリンクを確認してください)。しかし、loadObjectsAtResourcePath:usingBlock: を使用しているため、送信されるオブジェクトがないため、targetObject を nil に設定しなくても、応答は応答マッピングに自然にマッピングされます。