目标:根据接口提供的参数获得专辑的数据并在UITableViewCell中显示出来。
获取专辑的接口:
请求地址url: http://music.163.com/api/search/get/web需要设置的HTTP Haeder:
"Accept-Encoding”: "deflate,gzip"
"Content-Type”: "application/x-www-form-urlencoded"
"Referer”: "http://music.163.com/"
"User-Agent”: "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"
需要设置的HTTP Body:
NSString *body = [NSString stringWithFormat:@"s=%@&limit=%d&offset=%d&type=10”,搜索的关键字,当前返回的搜索结果数量num(num<=100),当前偏移量offset(offset==当前搜索的页数page*每页返回的结果num)];
需要设置的HTTP Method:
POST
这种接口我们现在写了几个了,因此它的套路就是
1.我们需要的东西放在callback中(比如这里面的我们需要的是:一个存放专辑的数组)
2.需要传入的参数:page,关键字key。
3.方法的实现
FetchDataFromNet.m文件中
#define kAlbumLimit 1
//方法的具体实现
+ (void)fetchAlbumData:(NSString *)key page:(NSInteger)page callback:(fetchTrackDataAndError)callback{
//获得网络地址并发送网络请求,设置相应的http的头信息
NSURL *albumUrl = [NSURLURLWithString:@"http://music.163.com/api/search/get/web"];
NSMutableURLRequest *request = [NSMutableURLRequestrequestWithURL:albumUrl];
[request setValue:@"deflate,gzip"forHTTPHeaderField:@"Accept-Encoding"];
[request setValue:@"application/x-www-form-urlencoded"forHTTPHeaderField:@"Content-Type"];
[request setValue:@"http://music.163.com/"forHTTPHeaderField:@"Referer"];
[request setValue:@"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"forHTTPHeaderField:@"User-Agent"];
//请求方法的类型
[requestsetHTTPMethod:@"POST"];
//定义内容的信息,需要定义kAlbumLimit(设置获得专辑的个数)(建议你测试的时候设置成一个)
NSString *bodyString = [NSStringstringWithFormat:@"s=%@&limit=%d&offset=%ld&type=10",key,kAlbumLimit,page *kAlbumLimit];
[request setHTTPBody:[bodyStringdataUsingEncoding:NSUTF8StringEncoding]];
//发送URL的连接,发送异步的获取数据的请求
[NSURLConnectionsendAsynchronousRequest:request queue:[NSOperationQueue currentQueue] completionHandler:^(NSURLResponse *response,NSData *data, NSError *connectionError) {
//异常的处理
if (connectionError) {
callback(nil, page, connectionError);
}else{
NSMutableArray *albumArray = [NSMutableArraynew];
@try {
//用json格式解析获得到的数据(你可以打印出来看一下,因为我们需要解析里面的具体的数据)
NSDictionary *albumDic = [NSJSONSerializationJSONObjectWithData:data options:kNilOptions error:nil];
// NSLog(@"albumDic:%@",albumDic);
//只有你知道albumDic字典的结构才能做下面的事,根据key去获得对应的专辑的数组(建议看一下这个数组)
NSArray *albumItemArray = [[albumDic objectForKey:@"result"]objectForKey:@"albums"];
// NSLog(@"%@",albumItemArray);
//下面的代码你需要搞清楚专辑的结构,还有你需要的数据,这样你需要建一个类albumData,所以得完成准备工作。
//for循环使得albumItemArray中的每一个对象都传入AlbumData接口中进行初始化,并且最后一个个添加到albumArray,并返回
[albumItemArrayenumerateObjectsUsingBlock:^(id obj,NSUInteger idx, BOOL *stop) {
AlbumData *albumData = [AlbumDataalbumDataWithDic:obj];
if (albumData) {
[albumArray addObject:albumData];
}
}];
}
@catch (NSException *exception) {
}
@finally {
callback(albumArray, page,nil);
}
}
}];
}
这个测试你需要在一个viewDidLoad中调用+ (void)fetchAlbumData:(NSString *)key page:(NSInteger)page callback:(fetchTrackDataAndError)callback
至于key可以设置成@“df”,随便设置的。page = 10;
我们需要看一下NSLog(@"albumDic:%@",albumDic);字典中的内容:
albumDic:{
code = 200;
result = {
albumCount = 9999;
albums = (
{
alias = (
);
artist = {
albumSize = 44;
alias = (
"\U94f6\U68ee",
"\U30b7\U30eb\U30d5\U30a9\U30ec"
);
briefDesc = "";
id = 21354;
img1v1Id = 0;
img1v1Url = "http://p4.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg";
musicSize = 288;
name = "Silver Forest";
picId = 936783906918296;
picUrl = "http://p3.music.126.net/0-gzlqU6jGW8etl5i_dGAQ==/936783906918296.jpg";
trans = "";
};
artists = (
{
albumSize = 0;
alias = (
);
briefDesc = "";
id = 21354;
img1v1Id = 0;
img1v1Url = "http://p4.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg";
musicSize = 0;
name = "Silver Forest";
picId = 0;
picUrl = "http://p4.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg";
trans = "";
}
);
blurPicUrl = "http://p4.music.126.net/IvcY_Sy0R1tP1BUZ2aLiog==/849922488271112.jpg";
briefDesc = "";
commentThreadId = "R_AL_3_81657";
company = C76;
companyId = 0;
copyrightId = 0;
description = "";
id = 81657;
name = "\U4e1c\U65b9\U30ce\U30b9\U30bf\U30eb\U30b8\U30a2";
pic = 849922488271112;
picId = 849922488271112;
picUrl = "http://p3.music.126.net/IvcY_Sy0R1tP1BUZ2aLiog==/849922488271112.jpg";
publishTime = 1250265600000;
size = 10;
songs = (
);
status = 1;
tags = "";
type = "\U4e13\U8f91";
}
);
};
}
看了之后,我们需要知道album中数据因此才有后面的代码:NSArray *albumItemArray = [[albumDic objectForKey:@"result"]objectForKey:@"albums"];
接下来要做的就是:
NSLog(@"%@",albumItemArray);
(
{
alias = (
);
artist = {
albumSize = 44;
alias = (
"\U94f6\U68ee",
"\U30b7\U30eb\U30d5\U30a9\U30ec"
);
briefDesc = "";
id = 21354;
img1v1Id = 0;
img1v1Url = "http://p4.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg";
musicSize = 288;
name = "Silver Forest";
picId = 936783906918296;
picUrl = "http://p3.music.126.net/0-gzlqU6jGW8etl5i_dGAQ==/936783906918296.jpg";
trans = "";
};
artists = (
{
albumSize = 0;
alias = (
);
briefDesc = "";
id = 21354;
img1v1Id = 0;
img1v1Url = "http://p4.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg";
musicSize = 0;
name = "Silver Forest";
picId = 0;
picUrl = "http://p4.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg";
trans = "";
}
);
blurPicUrl = "http://p4.music.126.net/IvcY_Sy0R1tP1BUZ2aLiog==/849922488271112.jpg";
briefDesc = "";
commentThreadId = "R_AL_3_81657";
company = C76;
companyId = 0;
copyrightId = 0;
description = "";
id = 81657;
name = "\U4e1c\U65b9\U30ce\U30b9\U30bf\U30eb\U30b8\U30a2";
pic = 849922488271112;
picId = 849922488271112;
picUrl = "http://p3.music.126.net/IvcY_Sy0R1tP1BUZ2aLiog==/849922488271112.jpg";
publishTime = 1250265600000;
size = 10;
songs = (
);
status = 1;
tags = "";
type = "\U4e13\U8f91";
}
)
现在我们知道album中需要哪些属性了,可以有blurPicUrl(专辑的图片),name(专辑的名字),id(专辑的id,后面会用到),artistName(artists中的name)。因此在albumData的接口中你可以这样写:
AlbumData.h文件中:
@interface AlbumData : NSObject
@property (nonatomic, strong) NSString *albumID;
@property (nonatomic, strong) NSString *albumName;
@property (nonatomic, strong) NSString *albumImage;
@property (nonatomic, strong) NSString *artist;
+ (id)albumDataWithDic:(NSDictionary *)dic;
AlbumData.m文件中:
@implementation AlbumData
+(id)albumDataWithDic:(NSDictionary *)dic{
return [[self alloc] initWithDic:dic];
}
- (id)initWithDic:(NSDictionary *)dic{
if (self = [super init]) {
self.albumID = [dic objectForKey:@"id"];
self.albumName = [dic objectForKey:@"name"];
self.albumImage = [dic objectForKey:@"picUrl"];
self.artist = [[dic objectForKey:@"artist"] objectForKey:@"name"];
}
return self;
}
接下来就是创建一个视图控制器AlbumSearch,控制视图。至于视图中的cell我们还会使用自定义的,可以复用之前我们已经弄好的CollectViewCell
是继承UITableViewCell的
控制器中的代码我会放在下一篇中。