Обновить несколько месяцев спустя
Реальный ответ заключается в том, что 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
} ];
Предостережение: Emptor (см. выше)
Установка параметров в блоке уничтожает любое сопоставление, которое вы могли установить в yourObject
, что как бы противоречит цели использования сопоставления объектов. Здесь есть исправление от Себастьяна loader.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
?
Я сделал это.
Метод загрузчика в делегате приложения
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>
и журнал rails говорят {"limit"=>"30"}
.
Из автозаполнения в Xcode видно, что запрос get
даже не использовал RKParams
. Просто NSDict
. Запросы POST используют его.
Моя цель — прикрепить строку запроса, т. е. ?location=singapore&etcetc
, к моим методам API в Rails. Для этого RK поставляется с надстройкой NSString
под названием appendQueryParams
ссылка на документы RK, которую можно использовать для добавления параметров запроса.
Если ваша цель — 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.
person
Damon Aw
schedule
24.02.2012