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 appendQueryParams
RK 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.
W końcu to też zrobiłem. Chciałem jednak użyć menedżera obiektów, aby użyć funkcji mapowania w RestKit. –
@demonsy Dzięki za to. Od pewnego czasu walę głową w to. – drewish
@drewish Dzięki. Za każdym razem, gdy ktoś uzna to za przydatne, postaram się go zaktualizować, by był nieco dokładniejszy. –