美文网首页程序员干货
【iOS】使用 ASIHTTPRequest 从豆瓣抓取书籍信息

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

作者: _赖笔小新 | 来源:发表于2014-05-28 22:20 被阅读903次

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

    相关文章

      网友评论

        本文标题:【iOS】使用 ASIHTTPRequest 从豆瓣抓取书籍信息

        本文链接:https://www.haomeiwen.com/subject/yrudtttx.html