2012-02-22 17 views
8

przy użyciu metody loadObjectAtResourcePath w metodzie GET, nie uwzględnia moich parametrów w żądaniach.iOS: RestKit loadObject & send params

na przykład, jeśli wyślę:

[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]; 
    }]; 

końcowy URL żądania nie obejmuje "param1 = val?" Część - dlaczego warto?

Odpowiedz

15

Miesięcy Aktualizuj Później

Prawdziwa odpowiedź brzmi, że loader.params jest stworzenie HTTP BODY, dlatego, że pracuje dla POST, PUT, DELETE itp ale nie dla GET gdzie params są dołączane do adresu URL.

Stąd odpowiedź poniżej nadal działa, jeśli jesteś w obliczu tego samego problemu dla GET, ale jeśli wysyłanie GET żądań, to głównie za pomocą metod, które przyczepiają się do params ciąg kwerendy.

Podsumowując różnice między nimi.

Wysyłanie params w organizmie HTTP (tj 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 (dla powyżej)

Ustawianie params w bloku niszczy mapowanie, które mogły zostać ustawiony w yourObject , rodzaj pokonania celu użycia mapowania obiektów. Tutaj jest poprawka Sebastiana loader.params - Extra params, jeśli naprawdę chcesz użyć tej metody do dołączenia dodatkowych parametrów do Posta nie w obiekcie.

Wysyłanie w params jak Query String (tj 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]; 

Reszta odpowiedzi jest tylko w celach informacyjnych, jestem hoarder.


Old Odpowiedź

Używam RestKit dla mojego projektu i stoi ten sam problem.

Myślę, że RKParams jest używany głównie do wykonywania żądań POST. Nie mogę w pełni odszyfrować twojego kodu, ponieważ 1) Nie wiem, czy deklaracja loader jest mi nieznana? 2) RKParams nie należy stosować z Object Manager?

Zrobiłem to.

Metoda Loader w App Delegat

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

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

Delegat

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

Wyjście: RK Request description: <RKRequest: 0x7993db0> i szyny zalogować powiedzieć {"limit"=>"30"}.

Z autouzupełniania w Xcode można zobaczyć, że żądanie get nie używało nawet RKParams. Tylko NSDict. Żądania POST go używają.

Moim celem jest dołączenie ciągu zapytań, tj. ?location=singapore&etcetc do moich metod API w Railsach. W tym celu RK jest dostarczany z dodatkiem NSString o nazwie appendQueryParamsRK docs link, którego można użyć do dołączania parametrów zapytania.

Jeśli Twoim celem jest grafika POST, możesz postępować zgodnie z powyższym pomysłem na temat korzystania z RKClient.

Aktualizacja:

Jeśli chcesz po prostu dołączyć do parametrów obiektu Menedżer

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

To jest przestarzała i zaznaczono amortyzację.


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

Użyj tego zamiast:

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

Szyny Zaloguj: {"location"=>"latitude,longitude", "limit"=>"20"}

Nadzieja w mojej odpowiedzi nie wprowadzać żadnych błędnych sformułowań.

Zobacz to pytanie RestKit GET query parameters.

+1

W końcu to też zrobiłem. Chciałem jednak użyć menedżera obiektów, aby użyć funkcji mapowania w RestKit. –

+0

@demonsy Dzięki za to. Od pewnego czasu walę głową w to. – drewish

+0

@drewish Dzięki. Za każdym razem, gdy ktoś uzna to za przydatne, postaram się go zaktualizować, by był nieco dokładniejszy. –