2012-02-22 21 views
8

utilizando loadObjectAtResourcePath en el método GET, no incluye mis parámetros en las solicitudes.iOS: RestKit loadObject & send params

por ejemplo, si envío:

[RKObjectManager objectManagerWithBaseURL:@"http://something/ws"]; 
    [[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"/res" delegate:self block:^(RKObjectLoader *loader) { 
     NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: 
           @"val", @"param1", 
           nil]; 
     loader.params = [RKParams paramsWithDictionary:dict]; 
    }]; 

la solicitud de URL final no incluye la parte "param1 = val?" - ¿por qué?

Respuesta

15

Actualizar meses después

La verdadera respuesta es que loader.params es crear un HTTP BODY, por lo tanto, funciona para POST, PUT, DELETE, etc, pero no para GET donde los params se anexan a la URL.

Por lo tanto, la respuesta a continuación todavía funciona si estás frente a la misma edición de GET, pero si usted está enviando peticiones GET, es sobre todo el uso de los métodos que se adhieren los parametros de la cadena de consulta.

Para resumir las diferencias entre los dos.

params que envía en el cuerpo HTTP (es decir POST, UPDATE, DELETE)

// Convert a NS Dictionary into Params 
RKParams *params = [RKParams paramsWithDictionary:optionValues]; 

// I use sendObject to skip the router. Otherwise it's normally postObject 
[[RKObjectManager sharedManager] sendObject:yourObject toResourcePath: yourResourcePath usingBlock:^(RKObjectLoader *loader) { 
    loader.method = RKRequestMethodPOST; 
    loader.delegate = delegate; 
    loader.params = params; // This sets params in the POST body and discards your yourObject mapping 

} ]; 

caveat.emptor (por arriba)

Ajuste de parametros en el bloque destruye cualquier asignación que podría haber puesto en yourObject , en cierto modo frustra el propósito de usar el mapeo de objetos. Hay una solución aquí por Sebastian loader.params - Extra params si realmente desea utilizar este método para agregar parámetros adicionales a su publicación no en el objeto.

El envío de params como cadena de consulta (es decir GET)

// Make a NS dictionary and use stringByAppendingQueryParameters 
NSDictionary *shopParams = [NSDictionary dictionaryWithKeysAndObjects: 
           @"limit",@"20", 
           @"location",@"latitude,longitude", 
           nil]; 

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:[@"/api/v1/shops.json" stringByAppendingQueryParameters:shopParams] delegate:objectDelegate]; 

El resto de la respuesta es sólo para referencia, soy un acaparador.


respuesta Antiguo

estoy usando RestKit para mi proyecto y frente a la misma cuestión.

Creo que RKParams se utiliza principalmente para hacer POST solicitudes. No puedo descifrar completamente su código porque 1) ¿No sé la declaración de loader? 2) RKParams no debe usarse con Object Manager?

Lo hice.

cargador Método de Aplicación Delegado

NSDictionary *shopParams = [NSDictionary dictionaryWithKeysAndObjects:@"limit",@"30", nil]; 

[[RKClient sharedClient] get:@"/api/v1/shops.json" queryParams:shopParams delegate:self]; 

Delegado

- (void)requestDidStartLoad:(RKRequest *)request { 
    NSLog(@"RK Request description: %@",[request description]); 
} 

salida: RK Request description: <RKRequest: 0x7993db0> y los carriles log decir {"limit"=>"30"}.

Desde la autocompleta en Xcode, puede ver que la solicitud get ni siquiera usó RKParams. Solo un NSDict. Las solicitudes POST lo usan.

Mi objetivo es adjuntar una cadena de consulta, es decir, ?location=singapore&etcetc a mis métodos API en Rails. Para esto, RK viene con un complemento NSString llamado appendQueryParamsRK docs link que puede usar para agregar params de consulta.

Si su objetivo es POST imágenes, etc., puede seguir la línea de pensamiento anterior utilizando RKClient.

Actualización:

Si lo que desea es añadir parámetros a Gestor de objetos

NSDictionary *shopParams = [NSDictionary dictionaryWithKeysAndObjects: 
           @"limit",@"20", 
           @"location",@"latitude,longitude", 
           nil]; 

Esta es obsoleta y marcado para desaprobación.


[[RKObjectManager sharedManager] loadObjectsAtResourcePath:[@"/api/v1/shops.json" appendQueryParams:shopParams] delegate:self]; 

Use este lugar:

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:[@"/api/v1/shops.json stringByAppendingQueryParameters:shopParams] delegate:yourLoaderDelegate]; 

rieles Log: {"location"=>"latitude,longitude", "limit"=>"20"}

esperanza en mi respuesta que no hizo ninguna declaración equivocada.

Consulte esta pregunta RestKit GET query parameters.

+1

Eventualmente es lo que hice también. Sin embargo, quería usar el administrador de objetos para usar la función de mapeo de RestKit. –

+0

@daemonsy Muchas gracias por esto. He estado golpeando mi cabeza contra eso por un tiempo. – drewish

+0

@drewish Gracias. Cada vez que alguien lo encuentre útil, intentaré actualizarlo para que sea un poco más completo. –