2012-10-21 41 views
6

Tôi đang cố tải kết quả API tìm kiếm iTunes vào các đối tượng tùy chỉnh bằng cách sử dụng RestKit. Tôi đã xác định một lớp con NSObject đơn giản cho kết quả: ánh xạ đối tượngÁnh xạ kết quả API tìm kiếm iTunes với 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 

Để đơn giản, tôi đã xác định

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

Tôi đã thử một vài cách khác nhau để thực sự yêu cầu kết quả, sử dụng cả RKObjectManager tùy chỉnh và RKObjectRequestOperation. ví dụ đơn giản của tôi với RKObjectRequestOperation trông giống như:

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

Thật không may, tôi nhận được lỗi sau từ RKResponseMapperOperation: "restkit.network:RKResponseMapperOperation.m:197 Không thể phân tích dữ liệu đáp ứng: Loaded một phản ứng không xử lý được (200) với nội dung nhập 'text/javascript' "

Tôi có đăng nhập RestKit mạng và có vẻ như phản hồi từ API iTunes đánh dấu loại nội dung là 'text/javascript', trong khi nội dung chứa JSON hợp lệ. Tôi đã cố gắng nói với RKObjectRequestOperation rằng văn bản/javascript là một loại nội dung chấp nhận được.

Có ai có bất kỳ trải nghiệm nào với API iTunes và RestKit không? Tôi tò mò nếu đây là một vấn đề lập bản đồ đơn giản trên đầu của tôi, hoặc nếu iTunes API tuyên bố loại nội dung là javascript trong khi nó xuất hiện để được hợp lệ JSON là ném ra RestKit. Dưới đây là ví dụ về đáp ứng API tìm kiếm iTunes được ghi lại trong ví dụ của tôi.

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

Trả lời

2

Hai điều cần thực hiện.

Người đầu tiên bạn nhận được:

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

Điều thứ hai là để đăng ký serializer json cho loại này.

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

Sau đó, tất cả đều hoạt động!

Các vấn đề liên quan