【iOS】使用 ASIHTTPRequest 从豆瓣抓取书籍信息

1. 达成目标

豆瓣提供相应的api来提供开发人员获取相应的包括书籍、电影、小组等信息。

豆瓣api地址是:http://developers.douban.com/wiki/?title=api_v2

找到图书项,再找到根据isbn获取图书信息。可以看到它的API如下

GET https://api.douban.com/v2/book/isbn/:name

:name到时候要替换成相应的ISBN编码,ISBN就是书籍后面条形码对应的一串数字,提供全球唯一标识。

我们把《百年孤独》的ISBN码替换上去

GET https://api.douban.com/v2/book/isbn/9787544253994

把https后面链接粘贴到浏览器中打开,你会得到一串json数据


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

上面的数据就是我们最终需要得到的。

获取ASIHTTPRequest并集成

那么什么是ASIHTTPRequest?

ASIHTTPRequest就是一个对CFNetwork API进行了封装,并且使用起来非常简单的一套API

ASIHTTPRequest让http变得更好用了,相比原生的api

你可以在GitHub中找到ASIHTTPRequest的项目地址https://github.com/pokeb/asi-http-request

可以在官网http://allseeing-i.com/ASIHTTPRequest/找到使用方法和文档。

那么下面来介绍集成过程。

  1. 首先建立一个新的基于single view的工程。
  2. 拷贝所需要的ASIHTTPRequest源代码文件


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
iPhone projects must also include:
ASIAuthenticationDialog.h
ASIAuthenticationDialog.m
Reachability.h (in the External/Reachability folder)
Reachability.m (in the External/Reachability folder)

你可以在项目中新建一个group,然后把这些文件拖过去

  1. 设置非ARC的文件

build phases中的compile source中将所有属于ASIHTTPRequest的文件的compile flags填上-fno-objc-arc

  1. 编译将会通过

获取MBProgressHUD并集成

什么是MBProgressHUD?

就是一个简单的进度指示器,当我们程序在获取网络数据的时候出现的活动指示器,可以提升用户体验,虽然这是所有人都在做的事情

你也可以在GitHub中找到MBProgressHUD的项目地址https://github.com/jdg/MBProgressHUD

集成过程和上面类似,因为MBProgressHUD就一个类MBProgressHUD.h所以更加简单。
而且因为MBProgressHUD使用ARC,所以少了上面的第三步。

全部集成好后按cmd + b编译因该没有问题了。

编写代码

打开ViewController.m,在viewdidload方法中写如下代码

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 = @"加载数据中……";

这将发出一个http请求,在请求期间会把每个阶段的事情交由request的delegate处理。
并且在发出请求后初始化一个MBProgressHUD来指示当前程序的运行状态。
使用startAsynchronous方法发出的是异步请求,当然你也可以使用startSynchronous来发出同步请求

requestFinished 是当请求完成时调用的方法。具体代码如下

  • (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];
    }

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];将关闭指示器。

当请求出现失败的情况我们也要做相应的处理,代码如下

  • (void)requestFailed:(ASIHTTPRequest *)request {
    // [MBProgressHUD hideHUDForView:self.view animated:YES];
    }

同样需要关闭指示器。



到这里全部结束。

你可能感兴趣的:(【iOS】使用 ASIHTTPRequest 从豆瓣抓取书籍信息)