POST с комплектом отдыха

Вопрос:

У меня есть конечный путь JSON, который принимает почтовые запросы в следующем формате.

  {'values': [
{
"date":<measurement date as Unix time stamp>
"value":<weight>
}
{
"date":<measurement date as Unix time stamp>
"value":<weight>
}
...]}

«Значения» представлены классом «EntryCollection», а каждое значение представлено классом «Entry». Я озадачен тем, что нашел правильный способ сопоставить мои объекты с представлением JSON. Прямо сейчас у меня есть следующий код, который вызывает ошибку: «Операция сопоставления не смогла найти какие-либо вложенные представления объектов при найденных путях ключей».

RKObjectMapping *entryMapping = [RKObjectMapping requestMapping];

RKObjectMapping *valuesMapping = [RKObjectMapping mappingForClass:[EntriesCollection class]];
[valuesMapping addAttributeMappingsFromDictionary:[EntryCollection attributesMapping]];

[singleEntryMapping addAttributeMappingsFromDictionary:[SingleEntry attributesMapping]];
[singleEntryMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"entries" toKeyPath:@"entries" withMapping:valuesMapping]];
RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:entryMapping
objectClass:mappedClass
rootKeyPath:nil];

[self.objectManager addRequestDescriptor:requestDescriptor];
NSString *path = [self pathForPOST];

[self.objectManager postObject:weights path:path parameters:nil success:nil failure:nil];

EDIT для структуры данных

Моя структура данных проста (я полагаю):

EntryCollection
- NSArray *entries (a collection of objects of type Entry)

Entry
- NSDate *date
- NSNumber *weight;

Я бы хотел, чтобы POST EntryCollection заполнялся записями. Отображение EntryCollection — это «записи → значения», один из которых — «дата → дата, вес → значение».

Лучший ответ:

Я нашел решение. Оказывается, мне нужно сопоставление отношений для описания иерархии, подразумеваемой в JSON. Поскольку для каждого объекта значений нет типа, я создал «пустое» сопоставление и добавил к нему сопоставление отношений. Я также забыл установить правильный MIMEType и инвертировать отображение атрибутов моего класса. Думаю, несколько дней в restkit нужны, чтобы понять это.

RKObjectMapping *entryMapping = [RKObjectMapping requestMapping];
        [entryMapping addAttributeMappingsFromDictionary:[SingleEntry attributesMapping]];
        RKObjectMapping *entrySerializedMapping = [entryMapping inverseMapping];

    RKRelationshipMapping *entryRelationship = [RKRelationshipMapping relationshipMappingFromKeyPath:@"entries" toKeyPath:@"values" withMapping:entrySerializedMapping];

    RKObjectMapping *valueMapping = [RKObjectMapping requestMapping];

    [valueMapping addPropertyMapping:valueMapping];

    RKRequestDescriptor *descriptor = [RKRequestDescriptor requestDescriptorWithMapping:valueMapping objectClass:[EntriesCollection class] rootKeyPath:nil];

    [self.objectManager addRequestDescriptor:descriptor];
    self.objectManager.requestSerializationMIMEType = RKMIMETypeJSON;

    NSString *path = [self pathForPOST];

    [self.objectManager postObject:entryCollection path:path parameters:nil success:nil failure:nil];

Ответ №1

В любом случае ваша полезная нагрузка запроса JSON должна подтвердить следующую структуру данных:

NSArray

|
|______NSDictionary ->Key: Date Value: weight
|                   ->Key: value Value: weight
|
|______NSDictionary ->Key: Date Value: weight
|                   ->Key: value Value: weight
|
|______NSDictionary ->Key: Date Value: weight
->Key: value Value: weight

Оба NSArray и NSDictionary полностью совместимы с форматом данных JSON. Я не знаю о вашей базовой структуре объектов, но в конечном итоге этот массив должен быть отправлен в качестве полезной нагрузки NSData запроса, и вы сделаете это.

Ответ №2

Ну, если у вас есть проблема при сопоставлении, вам придется либо показать свою модель, класс и сопоставление, либо поставить RKLogConfigureByName("RestKit/ObjectMapping", RKLogLevelTrace); где-то в вашем коде, и давайте посмотрим вывод.

В качестве альтернативы, если структура ваших объектов зависит от того, что вы хотите AFNetworking на сервер, вы можете использовать встроенный клиент AFNetworking и выполнить простой запрос.

 [[RKObjectManager sharedManager].HTTPClient postPath:@"" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"WHOOO");

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
//
}];

Оцените статью
TechArks.Ru
Добавить комментарий