「Noah Veltman的午餐会」关于API——非程序员们看过来

分享给朋友:

[zilla_alert]在BBC工作期间,Noah Veltman 为编辑人员和设计师们组织了一系列午餐小会。这些小型讲座的内容不是关于如何写代码或者完成某个具体项目,而是让这些非工程人员了解在新闻实践中经常会遇到的技术话题,让技术问题不再那么高深莫测。当非工程人员对基础的技术有所了解后,“这个项目要花多长时间?”、“我们如何做出这样的东西?”、“我们要如何妥协才能在技术上实现它?”如此这般的问题就会被有效率的双向对话所替代。

出于这样的目标,这个系列中将不太涉及真正的写代码的教学。但对那些想好好钻研开发的人来说,这个系列将提供非常值得尝试的努力方向。这些都是真实发生在午餐会上的讨论,所以也许变成文字后少了一些临场感,但无论是对于程序员、记者还是设计师来说,这些都仍然是很有帮助的、值得学习的材料。

Noah Veltman现任纽约WNYC电台数据新闻团队的开发人员,擅长交互图表、地图和基于数据的新闻应用开发。此前他曾获得Knight-Mozilla开放新闻奖学金并在伦敦BBC NEWS工作。数据新闻网将陆续推出Noah Veltman午餐会的其他资源。

【Noah Veltman的午餐会】系列由数据新闻网独家授权编译,更多该系列文章:
【Noah Veltman的午餐会】Excel vs. Database
【Noah Veltman的午餐会】制作在线地图
【Noah Veltman的午餐会】网页抓取
【Noah Veltman的午餐会】避免数据清理时的失误
【Noah Veltman的午餐会】XML与JSON:特征大比拼
[/zilla_alert]

API是什么? 

API全称为Application(应用) Programming(编程/程序) Interface(接口/界面)。我们今天先不看应用和编程这两块,先来看看Interface,也就是接口或者说界面。你可能没有意识到,但接口无处不在,电脑运行的系统就是一种接口,电梯里的按钮也是一种接口,开车时踩的油门和刹车也是接口。

接口简化一个复杂系统对外的某种操作,就好像汽车仪表盘能让你不需要打开引擎盖也能知道里面的状况。一个网页的应用程序接口就像汽车仪表盘,它简化了在Twitter或者Youtube这样的网站上的一些特定操作,把操作者的动作转化成电脑系统另一端技术层面的细节。

网页应用程序接口(Web API)是什么?

网页应用程序接口有很多种,其中最为非程序员的大众所了解的就是叫做REST(含状态传输;Representational State Transfer,简称REST,一种软件架构风格,典型的有Amazon.com和Yahoo!的页面风格), 或者RESTful(REST别称)的应用程序接口。接下来我提到的所有应用程序接口全部是指这一种。

网页应用程序接口通过URL(网址)控制,从这个角度上来说,整个万维网就是一种应用程序接口。打开浏览器输入网址,世界上某一处的网页服务器接收到这一信息后进行处理,再给发出指令的浏览器发回特定内容,一般应用程序接口就是这么工作的。

普通URL和应用程序接口URL的最大区别就在于普通URL发回的是给操作浏览器的人看的工整内容,但网页程序接口URL发回的却是给计算机看的“难看”的内容。

twitter_api

在浏览器中输入网址http://twitter.com/,得到的是一个有各种彩色图片和按钮的漂亮网页,专为坐在浏览器前的人量身定制,并不适用于数据收集和分析。这个网页下的结构其实并不连贯,看起来也有些令人困惑,如果你希望从中获得大量信息,并从中提取你真正需要的内容,那这个一般的网址和网页并不适用。

在浏览器中输入https://api.twitter.com/1.1/statuses/home_timeline.json 时,得到的是一个有一堆文字,却即没有漂亮的彩色图片又没有按钮的页面,这个页面是为计算机量身定制的,并不是给用户早上边喝咖啡边刷推特时用的。若你想要做的是提取并分析微博和微博背后的大数据,这个页面就会非常有用。

网页应用程序接口把所有仅为了视觉美感而存在的内容剥去,有了它就像抄近路到达网站服务器数据库。Twitter不可能随随便便就让任何人登入他们内部的数据库到处闲逛——当然若你在那工作就另当别论了——但若你有了它家的API,就能获得一种相对比较容易的方式进入数据库,当然也还是有所限制的。

应用程序接口能干嘛

api2

图片: http://geekandpoke.typepad.com/geekandpoke/web20/

1、在最短的时间内获得最多信息。大多数时候,你可以坐在那打开100多个页面,并一个个复制黏贴你想要的信息。若你恰好是个程序员,可能会花很多时间研究页面布局,然后写一个爬虫把所需信息扒拉下来。两种方法都很耗时耗力。这时候应用程序接口就可以省时省力了。

比如说:你想从Flickr上获得所有标记有“maui”(夏威夷毛伊岛,度假胜地),用尼康相机摄于2012年,并且宽度大于高度的照片。这时你可以用网站内设的搜索功能,一个个点开搜索结果查看,并找到符合要求的复制黏贴。但这可能得花上你几个小时。若用了Flickr提供的应用程序接口,就可以在搜索中提出详细要求,得到的会是一个代码页面而不是一个排列着图标的页面。
2、得到独家信息。有时候,应用程序接口能让你接触到一般网页上并不显示的信息,或者是藏在数据库角落里,一般用户看不到(一般都是因为网站作者认为用户即使看到了也没用或者不会感兴趣)的信息。作为记者,却很有可能会对这些信息感兴趣,因为它们可能可以给你带来新闻线索。

比如:Twitter可能不会把某一个特定日子的所有微博放在网站上给你看,但通过应用程序接口你却可以下载这些信息。烂番茄(影评网站)的应用程序接口能让你接触到影片上映时的大数据,这些数据在一般页面上都是找不到的。

3、制作自动从其他来源获取实时数据的新闻应用。

最好的例子就是在报道超级碗比赛时,应用程序接口可以让你从instagram上找到所有从比赛场地附近坐标拍摄的照片。

4、个性化网页或应用程序提供数据的服务。

例如:你可能在用MailChimp的服务来管理你的邮件联系人。有时候你想在某种条件下自动移除或添加联系人,应用程序端口可以帮你做到这些,不需每次都人工管理自己的联系人表。

第一条和第二条都适合不会编程的记者,能让他们掌握大量获取某一方面的专门数据并简化工作的方法。第三和第四条都需要使用者掌握一定的编程基础。

所以,应用程序接口的工作原理是?

基础

首先,你应就所需数据是否可以通过应用程序接口获得做出判断。最简单的方法就是Google搜索,或者从主页下方找到“API”或者“开发者”的链接。有时候会有外部的API,这些就需要比较仔细了。我这里不建议使用。

一般你会找到一些叫做应用程序接口规范的文件,这是API的使用说明,它告诉你应该怎么操作,下面是一些例子:

The Twitter API: https://dev.twitter.com/docs/api/1.1
The New York Times Best Sellers API: (纽约时报畅销排行API:) http://developer.nytimes.com/docs/best_sellers_api/

这些操作指南都信息量巨大,基本上它们提供的就是一个你可以用来获取数据的网址列表。这些网址的名字各不相同,使用这些网址叫做提出request(请求) 基本上就像去图书馆,只不过是Twitter,YouTube或者什么其他网站的开源数据图书馆。用API就和你去一般图书馆,走到前台问工作人员索要需要的信息那样容易。

每个网址都可以找到针对某一页或某一区块的详尽的使用说明,一般由两部分组成,分别是:参照系(参数)和回应(响应)。

Parameters参照系(参数)

参数是可以作为网址的一部分来定义所需内容的信息。比如,使用twitter提供的API时,网址可能是:

但这并不等同于告诉twitter你想要搜索的内容,必须在此基础上加上参照系,

才能将搜索范围缩小到burritos(墨西哥卷)

参数别称变量,因为它们会变,作为网址的一部分,变量会根据你的搜索需求不断变化。如果把每个API资源想象成一个仪器,那每个参数就像那上面的一个旋钮。

对一些已经给出的网址来说,有些变量可能是必须的,有些是可选的。我们回到twitter的例子来看:

这里的q 后面跟的是搜索的关键词,因此是必须的参数,若没有参数,API就无法运行你的搜索请求。也有许多别的选择性参数,比如说,加上lang(语言)作为参数,那么就是告诉API你只想要特定语言的结果,API会进行相同的搜索,但显示的结果却只是英语的:

这只是有关参数的冰山一角,对已知网页来说,一般会有许多可选参数来进一步优化你的搜索,在指导手册中列出的是,这些指令可能会默认将所有你并未详细说明的参数列出来。举个例子说明它有多重要;比如对于结果的默认显示数量的上限是15, 我们必须去给出详细说明,才能在一次搜索中获得多于15的数据。

参数能确定的是:

  • 你想要一次获得多少结果?
  • 想要结果如何排列?
  • 想要什么时间段内的结果?
  • 想要什么地点的?
  • 想要什么形式的?

你可能会疑惑,在我们举的这几个例子中,这些参数是怎么跟到网址最后的。我们接下来马上会聊到这个问题。

The Response响应类

使用API时,你需要提供给计算机的就是一个网址,其后可以跟上一些参数,得到的就是响应(response),它可以是以下两者之一:

  • 数据-这是你需要的
  • 关于为什么你的需求失败的解释-可能是你没有加上所需的参数,也可能是你超过了所规定的(数据)流量限制,你需要添加验证来获得某些特定操作的权限,或者是在你的操作中遇到了其他一些问题。

解释类文件应该可以让你了解,什么样的请求会得到什么样的响应,下面这个例子就说明了在使用烂番茄的API时,搜索007电影大破天幕杀机(skyfall),可以得到怎样的响应:

看上去好像没什么帮助,看起来就是一大块密实的乱码,各种数据被压缩到了一起。我们拆解来看:

现在这些内容看起来比较容易理解了,我们先不看那些大括号或者逗号,你得到的大致上就是有关电影007:大破天幕杀机的一些基本信息,包括评分,上映日期,演员表等内容。

当你获得一段数据组成的响应时,其组成几乎一定是如下两种格式之一:XML或者JSON。为了对这些数据进行充分挖掘,你需要先理解这两种格式,可以阅读我们之前讨论过的XML和JSON

GET vs. POST

比较GET和POST方法

对任意API方法/资源/包括参数的网址来说,使用方法不外乎如下三种:

1、改写URL

大多数时候,网址都是可以进行部分改写的,打个比方,一段网址可能写成这样:

为了取得不同的变量,可以将网址改写成这样:

(第一页,根据价格,XML格式)

(第五页,根据日期,JSON格式)

2、在网址结尾加上GET参数

相比上面一条来说,这个变量比较小,当你看到一段网址里面有问号,后面跟着一段乱码,那么问号后面的内容就是一段GET参数,每一个都有它自己的名字和存在价值,比如说:

比如说,在这段网址中:

用到了额外的两个参数:

  • 一段叫做query(查询),我们用ducktales来作为query(查询)的参数
  • 用English 来作为language(语言)的参数

大部分API的运行机制就是这样的,作为使用参数来搜索或做一段列表的方法,使用官方提供的网址,加上一段GET参数,就变成了像这样:

发送POST变量

如果你手边的文件显示必须要使用POST方法来提出搜索要求,那接下来就有些问题了。POST发送的是隐藏信息,数据也不会在网址中列出来。但使用互联网时你自己可能没有意识到,你其实一直在用POST格式,网购时填的付款信息表格就是用的POST格式,隐藏付款信息是出于安全考虑:

POST大部分都是用于隐藏一些敏感信息,比如能改变数据库中数据的信息,这些内容一般不会以网址形式呈现。

假设你有一个网页,用户输入他们的邮箱地址,加入列表,若这些数据通过GET格式发送:

假设用户A不小心把这个网址告诉了第三者,那第三方加载网页的时候就会重复把A加入列表的动作,若使用POST参数的话:

A就不会被重复加入列表。 若你使用的API方式需要通过POST发送参数,不会编程还是可以使用这一方法,只是稍微复杂了一些,可能光使用浏览器地址栏不行,你可以用一个叫做Fiddler的小程序,或者像Postman/REST Client那样的外挂程序,这些程序能帮你在搜索要求中加上POST参数。

API keys

有些API是全部开源的,若你找到一个类似的API, 那就可以直接用API网址,加上一些参数,放到网页中,得到的就会是一个有效的结果。最好的例子就可以是旧的twitter API,只需复制黏贴下面这段网址到网页就可以得到结果:

试试看!

最近,大部分API都不再像以前那样开放了,相对的,大部分需要一定程度的authentication(身份验证), 有些以API key的方式呈现,就是一长串字母和数字连在一起,作用就像密码一样。要使用这些API,还要多做一些功课,首先得填表获得使用权,幸好这个过程比较快,大部分API虽然需要API key,但仍是免费的。

比如说,若你在没有API key的情况下用烂番茄的API去搜索007 :大破天幕杀机这部电影:

得到的是这个结果:

若你加上API key作为参数,像这样:

得到的结果就是你想要的那个。

把API key作为和网址一起的参数使用,仍可以对服务器做出请求, 若你需要通过其他方式身份验证,那可能就需要掌握一定的编程技巧了。

限制

许多API都有自己的使用限制,比如在一小时或者一天之内我们能发送多少请求,这样的限制可以防止服务器超过其使用负荷。如果你不是程序员,或者不会编程,那其实也并不需要担心这些限制。限制只是为了防止大规模的恶意攻击而存在的,对于这些流量限制的细节,可以参考API的相关文档手册。需要注意的是,大部分API在一定的请求流量下是免费的,而超出部分则需要支付相应的金额才能使用。

非程序员使用API的例子:

  • 我想从服务器x上获得一些免费数据,先Google搜索看看服务器x是不是有API?哦耶!有诶!而且还是免费的!
  • 仔细看一遍API手册,搞清楚是不是能用URL来获得我感兴趣的信息。可以吗?那太好了!
  • 若有相关需要,注册一个API key也许是一个不错的想法。
  • 仔细想想,到底需要什么参数来进行URL操作,才能获得想要的数据呢?
  • 在浏览器里加载相关的参数来进行URL操作,看到网页的响应了吗?如果没有,那么重新退回第四步
  • 对获得的数据进行解析,更多的资料请参考这里 XML and JSON.

声明:

API在一次性估算的基础上获得数据,特别是当你熟悉XML和JSON格式时,API就会变得非常有用。但针对有些连续的进程,使用API时就该多个心眼。API并不是不变的,相反,它一直在变化,经常会有失效的情况发生,让本应唾手可得的数据获取的过程更艰难。随着现在越来越多的人依赖API来获取数据,API也不再全部免费,因此使用前更应该考虑清楚要通过哪一个API来

下面是一些流行的免费API:

New York Times
Yelp
Twitter
Flickr
Foursquare
Instagram
LinkedIn
Vimeo
Tumblr
Google Books
Facebook
Google+
YouTube
Rotten Tomatoes

这是一个REST API的列表: http://www.programmableweb.com/apis/directory/1?protocol=REST

本文译者:沈晨

作者简介

数据新闻网

数据新闻网以引介全球范围内最顶尖的数据新闻实践为初衷,以推动数据开放及媒体革新为宗旨,面向中国的新闻从业者、媒体管理者、新传教育者以及对传媒感兴趣的设计师、程序员,提供线上信息平台与线下交流机会。