iOS: RestKit loadObject и параметры отправки

используя метод loadObjectAtResourcePath для метода GET, не включает мои параметры в запросы.

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

[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 = val» - почему?


person Alon Amir    schedule 22.02.2012    source источник


Ответы (1)


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

Реальный ответ заключается в том, что 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
comment
В конце концов я тоже так сделал. Однако я хотел использовать диспетчер объектов для использования функции сопоставления RestKit. - person Alon Amir; 27.02.2012
comment
@daemonsy Большое спасибо за это. Я уже некоторое время бьюсь об него головой. - person drewish; 18.07.2012
comment
@drewish Спасибо. Каждый раз, когда кто-то находит это полезным, я постараюсь обновить его, чтобы сделать его более тщательным. - person Damon Aw; 24.07.2012