Sto usando RestKit 0.10.0 per un po 'di tempo e fino a questo punto, ho postato solo oggetti serializzati al mio server:RestKit interrogazione ottenere i parametri
[[RKObjectManager sharedManager] postObject:serializedObject
usingBlock:^(RKObjectLoader *loader) {
loader.delegate = self;
loader.objectMapping = responseMapping;
loader.serializationMIMEType = RKMIMETypeFormURLEncoded;
loader.targetObject = nil;
}];
Fin qui, tutto bene. Ma ora ho bisogno di fare una richiesta GET al server con alcuni parametri di query. La prima cosa naturale che è venuto in mente è stato quello di fare lo stesso come ho fatto per gli oggetti della pubblicazione:
- creare una mappatura di serializzazione per l'oggetto incapsulare query parametri
- creare una mappatura di risposta per l'oggetto che viene ricevuta da il server
- definire e utilizzare un router per RKRequestMethodGET (invece di RKRequestMethodPOST)
- fare la richiesta utilizzando getObject: usingBlock (invece di postObject: usingBlock)
ho scoperto presto questo non è il modo per farlo, quindi dopo aver cercato le risorse disponibili (RestKit Wiki, RestKit Google group) ora so di due soluzioni considerata valida:
- Aggiungendo i parametri di query al percorso risorsa.
Questo funziona perfettamente.
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;
}];
- impostazione dei parametri di ricerca nel blocco caricatore.
Questo non invia i parametri di query.
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;
}];
Le mie domande sono:
- Perché non fa il secondo lavoro soluzione?
- Perché la prima soluzione funziona senza dover impostare loader.targetObject su zero, sebbene non abbia alcun percorso della chiave radice nella risposta JSON?
- Quali sono i casi in cui dovrei usare il metodo getObject: usingBlock? Qual è lo scopo previsto?
- Per cosa dovrei usare loader.params? Il tutorial di mappatura degli oggetti del wiki dice che questa proprietà può essere utilizzata per incapsulare i parametri POST, ma non vedo il punto poiché posso avvolgere i parametri nell'oggetto serializzato che viene inviato con il metodo postObject: usingBlock.
Grazie.
[DOPO EDIT]
Per quanto riguarda la risposta alla mia seconda domanda: Sto impostando il targetObject a zero nel blocco del caricatore quando si effettuano le richieste POST beacause altrimenti RestKit tenterà di utilizzare la mappatura oggetto di invio per la risposta (controllare questo link per una discussione correlata). Ma dal momento che sto usando loadObjectsAtResourcePath: usingBlock :, non è stato inviato alcun oggetto, quindi la risposta sarà naturalmente mappata sul mapping delle risposte senza dover impostare il targetObject su zero.
Grazie. La spiegazione sulla richiesta GET/HEAD è molto utile. –
Grazie, questo chiarisce tutti i miei equivoci, tranne uno. Hai detto getObject: usingBlock: è solo un metodo di convenienza che invia semplicemente una richiesta di caricamento dell'oggetto utilizzando GET. Questo suona più come una definizione per loadObjectsAtResourcePath: usingBlock :. Nel getObject: usingBlock: case, è necessario specificare un oggetto come primo parametro e non capisco a cosa serve, poiché sto facendo solo un GET, non un PUT o un POST. –
Ad esempio, se si dispone già di un oggetto, è possibile ottenere i dati più recenti (aggiornamento) oppure è possibile accedere al percorso della risorsa - entrambi fanno la stessa cosa. Qualunque modo tu preferisca/è più facile. –