0

我想在 iOS 应用程序中从 iTunes 访问信息。

我正在执行常规的 http 请求(将参数作为 POST 或直接在 URL 中发送)

URL 有效,因为如果我使用浏览器,我会得到预期的结果(JSON 格式)。

{ "resultCount":0, "results": [] }

但在 iOS 中,JSONObjectWithData 返回一个空对象。

检查数据对象后,我发现返回的对象是一个 XML 对象(不包含所需的信息,而是一堆 XML 键/值]

NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://itunes.apple.com/search"]];

NSError *directError;
NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&directError];

if (!directError) {
    NSLog(@"%@", jsonDict);

} else {
    NSLog(@"JSON Error: %@", directError.localizedDescription);        
}

我查看了任何可能的 POST 参数以强制响应为 JSON,但没有找到任何东西。

附件是数据对象中包含的信息示例(在 XML 解析之后):

菜单

关键标题

关键音乐

字符串网址

关键https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewGenre?id=34

字符串项目

关键标题

iTunes 上的免费密钥

字符串网址

问候...恩里克

4

3 回答 3

1

更新:我还鼓励您不要使用 NSData dataWithURL 方法来获取内容,因为它会以同步方式触发请求。如果您请求大量数据,那么这将冻结 UI 线程。对于获取,您应该几乎总是使用异步操作。

我正在使用以下代码,它返回 JSON 响应,该响应稍后转换为 json 对象,如下所示:

-(void) setup
{
    NSString *iTunesURL = @"https://itunes.apple.com/search?term=pink-floyd";

    NSURLSession *session = [NSURLSession sharedSession];
    [[session dataTaskWithURL:[NSURL URLWithString:iTunesURL] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

        id jsonObject = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];

        NSLog(@"SUCCESS");

    }] resume];
}
于 2014-03-24T16:02:03.857 回答
0

也许这会导致响应是 JSON 而不是 XML:

NSUrlSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];

sessionConfig.HTTPAdditionalHeaders = @{ @"Accept" : "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" };

NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig];

[[session dataTaskWithURL:[NSURL URLWithString:@"http://itunes.apple.com/search"] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error){

    NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

}] resume];

那是使用 Chrome 的默认标题。你也可以试试这个:

sessionConfig.HTTPAdditionalHeaders = @{ @"Accept" : @"text/json" };

如果这不起作用:

sessionConfig.HTTPAdditionalHeaders = @{ @"Accept" : @"text/json, application/json" };
于 2014-04-15T16:38:50.570 回答
0

我也遇到了这个问题,虽然返回的数据看起来像 XML,但在分析 HTTP 流量后,Apple 正在返回一个重定向 url,试图在设备上打开 iTunes。通过更改 NSMutableURLRequest 的用户代理,我能够返回 JSON。

    let session = NSURLSession.sharedSession();

    let request = NSMutableURLRequest(URL:NSURL(string:"https://itunes.apple.com/search?term=wwg&country=us&media=software")!);
    request.HTTPMethod = "GET";
    //Be seen as the Mac OS
    request.addValue("Paw/2.3.3 (Macintosh; OS X/10.11.4) GCDHTTPRequest", forHTTPHeaderField: "User-Agent")
    //OR if you want to be seen as Chrome
    //request.addValue("Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36", forHTTPHeaderField: "User-Agent")

    let task = session.dataTaskWithRequest(request) { (data, response, error) -> Void in
        self.delegate?.didFinishSearching(data, response: response, error: error);
    }
    task.resume();
于 2016-05-12T22:40:05.643 回答