Parâmetros de consulta RestKit GET
Eu tenho usado o RestKit 0.10.0 por um tempo agora e até este ponto, eu só publiquei objetos serializados no meu servidor:
[[RKObjectManager sharedManager] postObject:serializedObject
usingBlock:^(RKObjectLoader *loader) {
loader.delegate = self;
loader.objectMapping = responseMapping;
loader.serializationMIMEType = RKMIMETypeFormURLEncoded;
loader.targetObject = nil;
}];
Por enquanto, tudo bem. Mas agora preciso fazer uma solicitação GET para o servidor com alguns parâmetros de consulta. A primeira coisa natural que veio em mente foi fazer o mesmo que fiz para postar objetos:
criar um mapeamento de serialização para o objeto que encapsula os parâmetros de consultacriar um mapeamento de resposta para o objeto que está sendo recebido do servidordefinir e usar um roteador para RKRequestMethodGET (em vez de RKRequestMethodPOST)faça o pedido usando getObject: usingBlock (em vez de postObject: usingBlock)Logo descobri que esta não é a maneira de fazê-lo, então depois de pesquisar os recursos disponíveis (Wiki do RestKit, Grupo RestKit do Google) Conheço agora duas soluções consideradas válidas:
Anexando os parâmetros de consulta ao caminho do recurso.Isso funciona perfeitamente.
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;
}];
Definindo os parâmetros de consulta no bloco do carregador.Isso não envia os parâmetros da 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;
}];
Minhas perguntas são:
Por que a segunda solução não funciona?Por que a primeira solução está funcionando sem ter que definir o loader.targetObject como nil, embora eu não tenha nenhum caminho de chave raiz na resposta JSON?Quais são os casos em que devo usar o método getObject: usingBlock? Qual é o propósito pretendido?Para que devo usar o loader.params? O tutorial de mapeamento de objetos dowiki diz que essa propriedade pode ser usada para encapsular parâmetros POST, mas eu não vejo o ponto desde que eu possa envolver os parâmetros no objeto serializado que está sendo enviado com o método postObject: usingBlock.Obrigado.
[MAIS TARDE]
Em relação à resposta à minha segunda pergunta: Eu estou definindo o targetObject como nil no loader block ao fazer solicitações POST porque caso contrário o RestKit tentará usar o mapeamento de objeto de envio para a resposta (confira istoligação para uma discussão relacionada). Mas como estou usando loadObjectsAtResourcePath: usingBlock :, não há nenhum objeto sendo enviado, portanto, a resposta mapeará naturalmente no mapeamento de resposta sem ter que definir targetObject como nil.