iOS: RestKit loadObject и отправить параметры - PullRequest
8 голосов
/ 23 февраля 2012

использование 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" - почему?

1 Ответ

15 голосов
/ 24 февраля 2012

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

Реальный ответ заключается в том, что 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 .

...