2012-02-22 3 views
8

с использованием loadObjectAtResourcePath по методу GET, не включает мои параметры в запросы.iOS: RestKit loadObject & send params

, например, если я посылаю:

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

запрос окончательный URL не содержит "param1 = значение?" Часть - почему?

ответ

15

Обновление месяцев спустя

Реальный ответ, что loader.params является создание HTTP BODY, следовательно, он работает для POST, PUT, DELETE и т.д., но не для GET где PARAMS добавляются к URL.

Следовательно, ответ ниже по-прежнему работает, если вы столкнулись с такой же проблемой для GET, но если вы посылаете GET запросы, это в основном с использованием методов, которые крепят Params к строке запроса.

Чтобы подытожить различия между ними.

Отправка PARAMS в HTTP Body (т.е. 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 (для выше)

Установка Params в блоке уничтожает любое отображение, которое вы могли бы установить в yourObject , вид поражений - цель использования сопоставления объектов. Исправлено здесь Sebastian loader.params - Extra params, если вы действительно хотите использовать этот метод для добавления дополнительных параметров к своему сообщению не в объекте.

Отправка в Params в качестве строки запроса (т.е. 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]; 

Остальная часть ответа только для справки, я скопидом.


Старый Ответ

Я использую RestKit для моего проекта и сталкивается с той же проблемой.

я думаю RKParams в основном используется POST запросы. Я не могу полностью расшифровать ваш код, потому что 1) Я не знаю объявления loader? 2) RKParams не используется с Object Manager?

Я сделал это.

Loader Метод в App Делегат

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

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

Делегат

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

Выход: RK Request description: <RKRequest: 0x7993db0> и рельсы журнал говорят {"limit"=>"30"}.

Из автозаполнения в Xcode вы можете видеть, что запрос get даже не использовал RKParams. Просто NSDict. Запросы POST используют его.

Моя цель - прикрепить строку запроса, то есть ?location=singapore&etcetc к моим методам API в Rails. Для этого в RK есть добавленный NSString аддон под названием appendQueryParamsRK docs link, который можно использовать для добавления параметров запроса.

Если ваша цель POST изображений и т. Д., Вы можете следовать приведенной выше строчке мышления об использовании RKClient.

Update:

Если вы просто хотите добавить параметры в объект диспетчера

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

Это является устаревшей и помечена для устаревания.


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

Используйте вместо этого:

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

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

Надежда в моем ответе я не делал никаких ошибочных утверждений.

См. Вопрос RestKit GET query parameters.

+1

В конце концов, это то, что я тоже сделал. Однако я хотел использовать диспетчер объектов для использования функции отображения RestKit. –

+0

@daemonsy Спасибо за это. Я некоторое время стучал головой о нее. – drewish

+0

@drewish Спасибо. Каждый раз, когда кто-то находит это полезным, я попытаюсь обновить его, чтобы быть немного более основательным. –

Смежные вопросы