Обновление месяцев спустя
Реальный ответ заключается в том, что loader.params
создает HTTP BODY
, следовательно, оно работает для POST, PUT, DELETE
и т. Д., Но не для GET
, где параметры добавляются к URL.
Следовательно, приведенный ниже ответ по-прежнему работает, если вы столкнулись с той же проблемой для GET
, но если вы отправляете GET
запросов, этов основном с использованием методов, которые присоединяют параметры к строке запроса.
Подводя итог различиям между ними.
Отправка параметров в теле HTTP (то есть 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 (для выше)
Установка параметров в блоке уничтожает все сопоставления, которые вы могли установить в yourObject
, что отрицательно сказывается на цели использования сопоставления объектов.Здесь есть исправление Себастьяна loader.params - Дополнительные параметры , если вы действительно хотите использовать этот метод для добавления дополнительных параметров в ваше сообщение, а не в объект.
Отправка в параметрахas Query String (т.е. 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
?
Я сделал это.
Метод загрузчика в делегате приложения
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
аддоном, называемым appendQueryParams
RK docs link , который можно использовать для добавления параметров запроса.
Если ваша цель - POST
изображений и т. Д., Вы можете следовать приведенной выше мысли об использовании RKClient
.
Обновление:
Если вы просто хотите добавить параметры в Диспетчер объектов
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 : {"location"=>"latitude,longitude", "limit"=>"20"}
Надеюсь, в моем ответе я не сделаллюбые неправильные заявления.
См. Этот вопрос Параметры запроса RestKit GET .