目标:根据我们获得的歌曲,从而对它进行进一步的解析,获取到歌曲的MP3地址,从而去实现歌曲的播放。
http://music.163.com/api/song/detail?ids=[%@],传入歌曲的id
"Referer”: "http://music.163.com/"
"User-Agent”: "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"
GET
一:歌曲地址接口的解析。
typedefvoid(^fetchDetailSongInfoCallback)(id item,NSError *error);
+ (void)fetchSongDetailInfo:(id)item callback:(fetchDetailSongInfoCallback)callback;
+ (void)fetchSongDetailInfo:(id)item callback:(fetchDetailSongInfoCallback)callback{
NSURL *songURL = [NSURL URLWithString:[NSString stringWithFormat:@"http://music.163.com/api/song/detail?ids=[%@]",[item valueForKey:@"trackIdentifier"]]];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:songURL];
[request setValue:@"deflate,gzip" forHTTPHeaderField:@"Accept-Encoding"];
[request setValue:@"http://music.163.com/" forHTTPHeaderField:@"Referer"];
[request setValue:@"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)" forHTTPHeaderField:@"User-Agent"];
[request setHTTPMethod:@"GET"];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue currentQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
if (connectionError) {
callback(nil,connectionError);
}else{
NSString *songID;
@try {
NSDictionary *itemDictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
NSLog(@"%@",itemDictionary);
songID = [[[itemDictionary objectForKey:@"songs"]firstObject]objectForKey:@"mp3Url"] ;
NSLog(@"%@",songID);
}
@catch (NSException *exception) {
}
@finally {
callback(songID,nil);
}
}
}];
}
注意:NSLog(@"%@",itemDictionary);打印输出字典的详细信息,可以看到:(这是我简化后的形式)
{
songs = (
{
commentThreadId = "R_SO_4_1297650";
copyFrom = "";
copyrightId = 0;
crbt = "<null>";
dayPlays = 0;
disc = "";
duration = 265000;
fee = 0;
ftype = 0;
hearTime = 0;
id = 1297650;
mp3Url = "http://m1.music.126.net/PXzmH5qPC7z83LnXRrgf6g==/2076977464870415.mp3";
mvid = 32973;
name = "Love the Way You Lie [Clean]";
no = 1;
playedNum = 0;
popularity = 100;
position = 1;
ringtone = "";
rtUrl = "<null>";
rtUrls = (
);
rtype = 0;
rurl = "<null>";
score = 100;
starred = 0;
starredNum = 0;
status = 1;
}
);
}
字典结构:{songs =({})}小括号表示是一个数组,而大括号表示的是字典,了解了结构才能正确的去解析字典
songID = [[[itemDictionary objectForKey:@"songs"]firstObject]objectForKey:@"mp3Url"] ;
所以先用key(songs),接着获取数组中的第一个对象,再将mp3Url作为key获得MP3的值
这样歌曲的MP3地址获取的接口就完成了,接着只需要在需要调用它的地方使用它既可。(不过要传入正确的参数才行)
接着需要考虑的是我们会在什么地方用到这个接口,就是在SearchSongVC试图控制器中点击cell时会调用接口
SearchSongVC.m文件中:
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{
MusicData *musicData = self.getDataArray[indexPath.row] ;
[self getSongID:musicData];
}
- (void)getSongID:(MusicData *)musicData{
[FetchDataFromNet fetchSongDetailInfo:musicData callback:^(id item, NSError *error){
if (error) {
NSLog(@"error = %@",error);
}else{
NSLog(@"%@",item);
[self.playMusic playMusic:item];
}
}];
}
首先获得点击cell那行的对象,因为之前我所有的歌曲对象都放在本地数组中getDataArray中,获得MusicData的对象后,用于参数传入方法中,代码中多次地方有NSLog语句是为了测试的方便,看程序执行到了哪里, [ self . playMusic playMusic :item];这是另外的接口调用,用于实现歌曲的播放。