He estado usando RestKit 0.10.0 desde hace un tiempo y hasta este punto, sólo publicado objetos serializados a mi servidor:RestKit de consulta GET Parámetros
[[RKObjectManager sharedManager] postObject:serializedObject
usingBlock:^(RKObjectLoader *loader) {
loader.delegate = self;
loader.objectMapping = responseMapping;
loader.serializationMIMEType = RKMIMETypeFormURLEncoded;
loader.targetObject = nil;
}];
Hasta ahora, todo bien. Pero ahora necesito hacer una solicitud GET al servidor con algunos parámetros de consulta. La primera cosa natural que se produjo en la mente era hacer lo mismo que hice para los objetos de publicación:
- crear una asignación de serialización para el objeto que encapsula la consulta de parámetros
- crear una asignación de respuesta para el objeto que está siendo recibida desde el servidor
- definir y utilizar un router para RKRequestMethodGET (en lugar de RKRequestMethodPOST)
- hacer la solicitud a través de getObject: usingBlock (en lugar de postObject: usingBlock)
pronto me di cuenta que esto no es la manera de hacerlo, por lo que después de buscar los recursos disponibles (RestKit Wiki, RestKit Google group) Ahora sé de dos soluciones consideradas como válidas:
- Al añadir los parámetros de consulta a la ruta del recurso.
Esto funciona perfectamente.
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;
}];
- Configuración de los parámetros de consulta en el bloque del cargador.
Esto no envía los parámetros de consulta.
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;
}];
Mis preguntas son:
- Por qué no funciona la segunda solución funcione?
- ¿Por qué funciona la primera solución sin tener que configurar loader.targetObject en nil, aunque no tengo ninguna ruta de clave de raíz en la respuesta JSON?
- ¿Cuáles son los casos en los que debería usar el método getObject: usingBlock? ¿Cuál es su propósito?
- ¿Para qué debo usar loader.params? El tutorial de asignación de objetos del wiki dice que esta propiedad se puede usar para encapsular parámetros POST, pero no veo el punto, ya que puedo ajustar los parámetros en el objeto serializado que se envía con el método postObject: usingBlock.
Gracias.
[editar más tarde]
En cuanto a la respuesta a la segunda pregunta: Me he estado fijando el targetObject a cero en el bloque del cargador al hacer peticiones POST pd lo contrario RestKit intentará utilizar el mapeo de objetos de envío de la respuesta (consulte este link para una discusión relacionada). Pero dado que estoy utilizando loadObjectsAtResourcePath: usingBlock :, no se envía ningún objeto, por lo tanto, la respuesta se asignará de forma natural en el mapeo de respuesta sin tener que establecer targetObject en nil.
Gracias. La explicación sobre la solicitud GET/HEAD es muy útil. –
Gracias, esto aclara todos mis malentendidos, excepto uno. Dijiste getObject: usingBlock: es solo un método de conveniencia que simplemente envía una solicitud de carga de objetos usando GET. Esto suena más como una definición de loadObjectsAtResourcePath: usingBlock :. En el getObject: usingBlock: case, tengo que especificar un objeto como primer parámetro y no entiendo para qué sirve, ya que solo estoy haciendo un GET, no un PUT o un POST. –
Por ejemplo, si ya tiene un objeto, puede OBTENER los datos más recientes (actualización), o puede acceder a la ruta del recurso; ambos hacen lo mismo. De cualquier manera que prefiera/es más fácil. –