【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数据
<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/找到使用方法和文档。

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

  1. 首先建立一个新的基于single view的工程。
  2. 拷贝所需要的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,然后把这些文件拖过去

  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方法中写如下代码

<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>
到这里全部结束。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

  • 自用收藏 原文:http://www.th7.cn/Program/IOS/201606/884245.shtml...
    西瓜皮奥特曼阅读 2,131评论 0 16
  • 1.图片浏览控件MWPhotoBrowser 实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图...
    万忍阅读 1,477评论 0 6
  • 哈喽!大家好,咱们的健康营养小课堂又和大家见面啦!是不是很期待今晚的精彩分享呀?面对即将到来的国庆中秋双节假期你们...
    伊人梦境阅读 533评论 1 13
  • 一言兴邦是金句、一语误国为良言;言语应是三思后、不可随意张口间;无人有义了解你、不善言辞自己担;沟通到底多重要、遥...
    神于天圣于地阅读 239评论 0 0
  • 2017.9.13 星期三 晴 今早小红花政策又起作用了!今早小邵同志又磨磨蹭蹭滴不爱起床。我说这样吧,...
    厦门路小学邵艺馨妈妈阅读 224评论 0 5