Сопоставление результатов API поиска iTunes с помощью RESTKit

Я пытаюсь загрузить результаты API поиска iTunes в пользовательские объекты с помощью RestKit. Я определил простой подкласс NSObject для результатов:

@interface LSiTunesResult : NSObject

@property (nonatomic) NSInteger itemID;
@property (nonatomic) NSInteger artistID;

@property (strong, nonatomic) NSString *title;
@property (strong, nonatomic) NSString *artistName;
@property (strong, nonatomic) NSString *collectionName;
@property (strong, nonatomic) NSString *itemDescription;

@property (strong, nonatomic) NSURL *imageURL;
@property (strong, nonatomic) NSURL *thumbnailURL;
@property (strong, nonatomic) NSURL *trackPreviewURL;
@property (strong, nonatomic) NSURL *trackViewURL;

//
+ (RKObjectMapping *)objectMapping;

@end

Для простоты я определил сопоставление объектов

RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[LSiTunesResult class]]; [mapping addAttributeMappingsFromDictionary:@{ @"artistName" : @"artistName" }];

Я пробовал несколько разных способов запроса результатов, используя как собственный RKObjectManager, так и RKObjectRequestOperation. Мой простой пример с RKObjectRequestOperation выглядит так:

RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:[LSiTunesResult objectMapping] pathPattern:nil keyPath:@"results" statusCodes:nil];
RKObjectRequestOperation *operation = [[RKObjectRequestOperation alloc] initWithRequest:urlRequest responseDescriptors:@[responseDescriptor]];
[operation.HTTPRequestOperation setAcceptableContentTypes:[NSSet setWithObject:@"text/javascript"]];

[operation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
    NSLog(@"The search results are: %@", [mappingResult array]);
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
    NSLog(@"Failure reason: %@", [error localizedDescription]);
}];

[operation start];

К сожалению, я получаю следующую ошибку от RKResponseMapperOperation: "restkit.network:RKResponseMapperOperation.m:197 Не удалось проанализировать данные ответа: загружен необработанный ответ (200) с типом содержимого "текст/javascript""

У меня есть вход в сеть RestKit, и кажется, что ответ от API iTunes помечает тип контента как «текст/javascript», а тело содержит действительный JSON. Я пытался сообщить RKObjectRequestOperation, что text/javascript является приемлемым типом контента.

У кого-нибудь есть опыт работы с iTunes API и RestKit? Мне любопытно, является ли это простой проблемой сопоставления с моей стороны, или API iTunes, утверждающий, что тип контента является javascript, хотя он кажется действительным, JSON отбрасывает RestKit. Ниже приведен пример ответа API поиска iTunes, который регистрируется во время моего примера.

   2012-10-21 01:48:54.061 Listen[99898:617] T restkit.network:RKHTTPRequestOperation.m:124 GET 'http://itunes.apple.com/search?term=The%20Lumineers&country=US&media=music&limit=1' (200):
    response.headers={
        "Cache-Control" = "no-transform, max-age=60";
        Connection = "keep-alive";
        "Content-Encoding" = gzip;
        "Content-Length" = 519;
        "Content-Type" = "text/javascript; charset=utf-8";
        Date = "Sun, 21 Oct 2012 05:48:54 GMT";
        Vary = "Accept-Encoding";
        "X-Apple-Partner" = "origin.0";
        "apple-timing-app" = "49 ms";
        "x-apple-application-instance" = 1018018;
        "x-apple-application-site" = NWK;
        "x-apple-orig-url-path" = "/search?term=The%20Lumineers&country=US&media=music&limit=1";
        "x-apple-translated-wo-url" = "/WebObjects/MZStoreServices.woa/ws/wsSearch?term=The%20Lumineers&country=US&media=music&limit=1";
        "x-webobjects-loadaverage" = 0;
    }
    response.body=


    {
     "resultCount":1,
     "results": [
    {"wrapperType":"track", "kind":"music-video", "artistId":350720227, "trackId":516035614, "artistName":"The Lumineers", "trackName":"Ho Hey", "trackCensoredName":"Ho Hey", "artistViewUrl":"https://itunes.apple.com/us/artist/the-lumineers/id350720227?uo=4", "trackViewUrl":"https://itunes.apple.com/us/music-video/ho-hey/id516035614?uo=4", "previewUrl":"http://a404.v.phobos.apple.com/us/r30/Video/fd/81/e1/mzi.gxodlwda..640x256.h264lc.u.p.m4v", "artworkUrl30":"http://a1838.phobos.apple.com/us/r30/Video/v4/41/64/37/416437c2-c02e-4706-3f13-a47f50ec2ccc/Cover.40x30-75.jpg", "artworkUrl60":"http://a621.phobos.apple.com/us/r30/Video/v4/41/64/37/416437c2-c02e-4706-3f13-a47f50ec2ccc/Cover.80x60-75.jpg", "artworkUrl100":"http://a1629.phobos.apple.com/us/r30/Video/v4/41/64/37/416437c2-c02e-4706-3f13-a47f50ec2ccc/Cover.100x100-75.jpg", "collectionPrice":1.99, "trackPrice":1.99, "releaseDate":"2012-04-03T07:00:00Z", "collectionExplicitness":"notExplicit", "trackExplicitness":"notExplicit", "trackTimeMillis":160952.0, "country":"USA", "currency":"USD", "primaryGenreName":"Singer/Songwriter"}]
    }

person ppilone    schedule 21.10.2012    source источник


Ответы (1)


Две вещи, чтобы сделать эту работу.

Первое, что вы получили:

operation.HTTPRequestOperation.acceptableContentTypes = [NSSet setWithObject:@"text/javascript"];

Второй — зарегистрировать сериализатор json для этого типа.

[RKMIMETypeSerialization registerClass:[RKNSJSONSerialization class] forMIMEType:@"text/javascript"];

Тогда все работает!

person Bob Spryn    schedule 30.06.2013