1. 达成目标
豆瓣提供相应的api来提供开发人员获取相应的包括书籍、电影、小组等信息。
豆瓣api地址是:http://developers.douban.com/wiki/?title=api_v2
找到图书项,再找到根据isbn获取图书信息。可以看到它的API如下
:name
到时候要替换成相应的ISBN编码,ISBN就是书籍后面条形码对应的一串数字,提供全球唯一标识。
我们把《百年孤独》的ISBN码替换上去
把https后面链接粘贴到浏览器中打开,你会得到一串json数据
<pre>
{
"alt": "http://book.douban.com/subject/6082808/",
"alt_title": "Cien años de soledad",
"author": [
"[哥伦比亚] 加西亚·马尔克斯"
],
"author_intro": "加西亚•马尔克斯(Gabriel García Márquez)1927年出生于哥伦比亚马格达莱纳海滨小镇阿拉卡塔卡。童年与外祖父母一起生活。1936年随父母迁居苏克雷。1947年考入波哥大国立大学。1948年因内战辍学,进入报界。五十年代开始发表文学作品。六十年代初移居墨西哥。1967年出版《百年孤独》。1982年获诺贝尔文学奖。",
"binding": "精装",
"catalog": "",
"id": "6082808",
"image": "http://img3.douban.com/mpic/s6384944.jpg",
"images": {
"large": "http://img3.douban.com/lpic/s6384944.jpg",
"medium": "http://img3.douban.com/mpic/s6384944.jpg",
"small": "http://img3.douban.com/spic/s6384944.jpg"
},
"isbn10": "7544253996",
"isbn13": "9787544253994",
"origin_title": "Cien años de soledad",
"pages": "360",
"price": "39.50元",
"pubdate": "2011-6",
"publisher": "南海出版公司",
"rating": {
"average": "9.2",
"max": 10,
"min": 0,
"numRaters": 44029
},
"subtitle": "",
"summary": "《百年孤独》是魔幻现实主义文学的代表作,描写了布恩迪亚家族七代人的传奇故事,以及加勒比海沿岸小镇马孔多的百年兴衰,反映了拉丁美洲一个世纪以来风云变幻的历史。作品融入神话传说、民间故事、宗教典故等神秘因素,巧妙地糅合了现实与虚幻,展现出一个瑰丽的想象世界,成为20世纪最重要的经典文学巨著之一。1982年加西亚•马尔克斯获得诺贝尔文学奖,奠定世界级文学大师的地位,很大程度上乃是凭借《百年孤独》的巨大影响。",
"tags": [
{
"count": 17805,
"name": "百年孤独",
"title": "百年孤独"
},
{
"count": 16685,
"name": "加西亚·马尔克斯",
"title": "加西亚·马尔克斯"
},
{
"count": 8894,
"name": "拉美文学",
"title": "拉美文学"
},
{
"count": 8256,
"name": "小说",
"title": "小说"
},
{
"count": 7107,
"name": "经典",
"title": "经典"
},
{
"count": 6468,
"name": "外国文学",
"title": "外国文学"
},
{
"count": 2985,
"name": "文学",
"title": "文学"
},
{
"count": 2518,
"name": "拉美",
"title": "拉美"
}
],
"title": "百年孤独",
"translator": [
"范晔"
],
"url": "http://api.douban.com/v2/book/6082808"
}
</pre>
上面的数据就是我们最终需要得到的。
获取ASIHTTPRequest并集成
那么什么是ASIHTTPRequest?
ASIHTTPRequest就是一个对CFNetwork API进行了封装,并且使用起来非常简单的一套API
ASIHTTPRequest让http变得更好用了,相比原生的api
你可以在GitHub中找到ASIHTTPRequest的项目地址https://github.com/pokeb/asi-http-request
可以在官网http://allseeing-i.com/ASIHTTPRequest/找到使用方法和文档。
那么下面来介绍集成过程。
- 首先建立一个新的基于single view的工程。
- 拷贝所需要的ASIHTTPRequest源代码文件
<pre>
ASIHTTPRequestConfig.h
ASIHTTPRequestDelegate.h
ASIProgressDelegate.h
ASICacheDelegate.h
ASIHTTPRequest.h
ASIHTTPRequest.m
ASIDataCompressor.h
ASIDataCompressor.m
ASIDataDecompressor.h
ASIDataDecompressor.m
ASIFormDataRequest.h
ASIInputStream.h
ASIInputStream.m
ASIFormDataRequest.m
ASINetworkQueue.h
ASINetworkQueue.m
ASIDownloadCache.h
ASIDownloadCache.m
<font color=red>iPhone projects must also include:</font>
ASIAuthenticationDialog.h
ASIAuthenticationDialog.m
Reachability.h (in the External/Reachability folder)
Reachability.m (in the External/Reachability folder)
</pre>
你可以在项目中新建一个group,然后把这些文件拖过去
- 设置非ARC的文件
在
build phases
中的compile source
中将所有属于ASIHTTPRequest的文件的compile flags
填上-fno-objc-arc
- 编译将会通过
获取MBProgressHUD并集成
什么是MBProgressHUD?
就是一个简单的进度指示器,当我们程序在获取网络数据的时候出现的活动指示器,可以提升用户体验,虽然这是所有人都在做的事情
你也可以在GitHub中找到MBProgressHUD的项目地址https://github.com/jdg/MBProgressHUD
集成过程和上面类似,因为MBProgressHUD就一个类MBProgressHUD.h
所以更加简单。
而且因为MBProgressHUD使用ARC,所以少了上面的第三步。
全部集成好后按cmd + b
编译因该没有问题了。
编写代码
打开ViewController.m,在viewdidload方法中写如下代码
<pre>NSURL * url = [NSURL URLWithString:@"https://api.douban.com/v2/book/isbn/9787544253994"];
ASIHTTPRequest * request = [ASIHTTPRequest requestWithURL:url];
request.delegate = self;
[request startAsynchronous];
MBProgressHUD * hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
hud.labelText = @"加载数据中……";
</pre>
这将发出一个http请求,在请求期间会把每个阶段的事情交由request的delegate处理。
并且在发出请求后初始化一个MBProgressHUD来指示当前程序的运行状态。
使用startAsynchronous方法发出的是异步请求,当然你也可以使用startSynchronous来发出同步请求
requestFinished 是当请求完成时调用的方法。具体代码如下
<pre>
- (void)requestFinished:(ASIHTTPRequest *)request {
if (request.responseStatusCode == 200) {
NSError * error;
// NSLog(@"返回数据是:%@",request.responseString);
id json = [NSJSONSerialization JSONObjectWithData:[request.responseString dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:&error];
if (json != nil && !error) {
if ([json isKindOfClass:[NSDictionary class]]) {
NSLog(@"json is %@\n", [json objectForKey:@"author_intro"]);
}
}
}
[MBProgressHUD hideHUDForView:self.view animated:YES];
}
</pre>
responseStatusCode是http请求的状态码,200表示请求成功
request.responseString 是http返回的数据,是一个字符串。
我们将使用NSJSONSerialization来将返回的字符串格式化为一个NSDictionary或者NSArray,在这里是NSDictionary。
可以看到我们最后输出了作者的信息
2014-05-28 21:22:57.446 t.tt[17154:60b] json is 加西亚•马尔克斯(Gabriel García Márquez)1927年出生于哥伦比亚马格达莱纳海滨小镇阿拉卡塔卡。童年与外祖父母一起生活。1936年随父母迁居苏克雷。1947年考入波哥大国立大学。1948年因内战辍学,进入报界。五十年代开始发表文学作品。六十年代初移居墨西哥。1967年出版《百年孤独》。1982年获诺贝尔文学奖。
最后的[MBProgressHUD hideHUDForView:self.view animated:YES];将关闭指示器。
当请求出现失败的情况我们也要做相应的处理,代码如下
<pre>
- (void)requestFailed:(ASIHTTPRequest *)request {
// [MBProgressHUD hideHUDForView:self.view animated:YES];
}
</pre>
同样需要关闭指示器。
</br>
到这里全部结束。