2012-10-21 10 views
6

Sto provando a caricare i risultati dell'API di ricerca di iTunes in oggetti personalizzati usando RestKit. Ho definito un semplice sottoclasse NSObject per i risultati: la mappatura oggettoMappatura dei risultati dell'API di ricerca di iTunes con RESTKit

@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 

Per semplicità, ho definito

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

Ho provato un paio di modi diversi per lo richiedono in realtà il risultati, utilizzando sia un RKObjectManager personalizzato sia un RKObjectRequestOperation. Il mio semplice esempio con RKObjectRequestOperation assomiglia:

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]; 

Purtroppo, ottengo il seguente errore da RKResponseMapperOperation: "restkit.network:RKResponseMapperOperation.m:197 Impossibile analizzare i dati di risposta: Loaded una risposta Unprocessable (200) con il contenuto digita 'text/javascript' "

Ho accesso alla rete RestKit e sembra che la risposta dell'API di iTunes contrassegni il tipo di contenuto come" testo/javascript ", mentre il corpo contiene JSON valido. Ho provato a dire a RKObjectRequestOperation che text/javascript è un tipo di contenuto accettabile.

Qualcuno ha esperienza con l'API di iTunes e il RestKit? Sono curioso di sapere se si tratta di un semplice problema di mappatura da parte mia, o se l'API di iTunes che afferma che il tipo di contenuto è javascript mentre sembra essere valido, JSON sta scaricando RestKit. Di seguito è riportato un esempio della risposta dell'API di ricerca di iTunes registrata durante il mio esempio.

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"}] 
    } 

risposta

2

Due cose per fare questo lavoro.

La prima si ha:

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

Il secondo è quello di registrare il serializzatore JSON per questo tipo.

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

Quindi tutto funziona!

Problemi correlati