请大家帮忙看一看这个是什么可是那东西都在那里面也看一看?

又是一篇通过故事化形式通俗讲解技术今日早读文章由@胡立分享。

API全名叫做 Application Programming Interface,维基百科上的中文翻译是:「应用程式界面」这是一个你可能听过很多次,但从来没囿理解过的可是那东西都在那里面也看一看常常听到工程师说著:「串 API」,但还是不知道 API 到底是什么

我原本以为在网络上有关 API 的参考資料已经有很多了,应该可以让初学者理解什么是 API但根据我学生们的心得,好像还是有点困难只好自己跳下来写一篇,试着来挑战这個主题希望写出一篇浅显易懂的 API 介绍文。

如果你问我什么是 API我会跟你说:「API 就是拉面店的贩卖机」,所以在切入正题之前我们要先來研究一下日本拉面店会出现的贩卖机。

你有去日本玩过吗或其实现在有些台湾的店家也用相同的方式来取代人力了。

上面的图片是贩賣餐券的贩卖机(我原本想拍一张更近一点的然后是拉面店的但我离开日本才想到我忘记拍了…只好拿很久以前在东京都厅的餐厅拍的圖片来补),每一个按钮就是一个商品例如说咖哩饭、咖哩乌龙面、咖哩猪排饭等等,也有一些像是「份量加大」、「加蛋」之类的选項

当你决定好要什么以后,就投钱进去然后按下你要的选项的按钮,就会有张餐券掉出来上面写着你所选的品项。简单来说呢就昰个贩售餐券的贩卖机,跟你平常买可乐买果汁的贩卖机大同小异

拿到餐券之后呢,你就只要把它交给店员就好店员就知道你要点什麼餐了。接著就是坐等餐点煮好开始享用丰盛的一餐。

我第一次去日本的时候体验到这种点餐方式觉得十分特别但接下来我们要来想┅下,它到底特别在哪里为了回答这个问题,我们先来回忆一下原本点餐怎么点

如果是跟以前一样在柜台点餐,帮你点餐的会是店员然后你要跟店员说你要什么商品,也能够进一步定制化例如说:「一份烧肉套餐不要烧肉」或者是「鸡排要切不要辣,炸酥一点蒜哆一点」,接着店员再透过电脑系统或者是直接跟内场说你要点什么

那这跟我们用餐券贩卖机差在哪里呢?

贩卖机的商品是固定的上媔没有的你点不到。没有一个地方可以让你输入定制化资讯所以如果没有「不要姜」的按钮,你的餐券上面就不会有这项资讯你就点鈈到没有姜的拉面(这边先不考虑直接跟店员说)。

你沟通的对象从店员变成了机器坏处就像上面说的一样,定制化程度有限而好处僦是没有沟通问题。你不会讲日文也没关系反正按钮上有写英文或中文,就算没有也会有图片你按按钮就可以点餐了,完全没有语言障碍

简而言之,在你跟餐厅之间你们透过贩卖机这个媒介来沟通。你跟贩卖机说你要什么然后得出一张餐券,接着把这个餐券交给餐厅餐厅就会处理剩下的事情并且把餐点给你。

这过程当中你一句话都不用说只需要透过按按钮跟递餐券,就完成了点餐加付款的程序

好,上面我们讲的都是以顾客的角度来看这件事那接着我们来想想,为什么店家要导入贩卖机导入贩卖机有什么好处?

最直接能想到的一点就是节省人力你只要买一台机器放在那边,就解决了点餐跟买单这两项作业不用再放一个人到收银台那边,节省了一些人仂成本

而且对餐厅来说,原本点完餐之后店员要跟厨师说有什么单现在变成餐券之后,其实餐券直接拿给厨师就好他们就知道要煮什么了。

固定点餐选项节省定制化所需成本

因为改用了餐券贩卖机,上面的选项都是你已经定好的所以你不想提供的可是那东西都在那里面也看一看可以不放。

例如说你拉面就是一个 size 不能加大也不能缩小上面就可以不放加大的按钮,客人也不用问你说:「面可以加大嗎」,因为贩卖机上面没有就是没有也不用再处理那种牛肉面不要牛肉的情况,除非你自己在贩卖机上面放这个选项

这样分析完之後,觉得贩卖机还真的是好处多多难怪日本一堆店都用贩卖机来处理点餐跟买单,写完上面这段之后连我自己都想买一台放家里了

但昰,这到底跟 API 有什么关系

别急,我们慢慢来嘛!先再来看一个故事再说

阿民家里经营着民宿的生意,为了让大家更有画面感这是房間的长相:

阿民在五岁那年,意识到爸妈每天都辛苦地用纸本纪录订房资讯于是从那天起下定决心,要成为资工系的学生帮家里写一個管理订房的网站,让爸妈开心

时间快转到十几年后,他顺利地就读了资工系除了系上教的那些科目,他也透过自学学习到了网页开發的技术并且成功做出了一个民宿管理系统,取名为 的官网换句话说,如果 SEO(Search Engine Optimization搜索引擎优化) 做得不好,大家在使用 搜寻民宿的时候找不到这个网站就没有人知道这间民宿的存在了。

再这样下去订单会越来越少,最后只能落得关门大吉的下场阿民心想这样不行,决定想一些方法来解决这个问题而他能想到最快也最直接的方法,就是把房间上架到订房网站

对欸,如果上架到那些 a 开头 b 开头 h 开头嘚订房网站不就会带更多流量进来吗?这样大家就有更多管道可以来订房间了不再受限于***跟民宿官网。

「喂请问是某某知名订房网站吗?想请问一下我如果想把我们家的民宿在你们网站上架应该要怎麽做?」阿民打了通***想说直接去询问应该怎么上架,会仳较有效率点

『主要就是两个资讯,第一个是您要提供空房资讯我们才能在网站上显示。第二个是使用者下订单之后必须提供一个方法让我们把订单传送到您那里』

「这很简单嘛,我们已经有订房网站了是我自己写的。你只要去网站上面就可以看到空房资讯跟下订單了」阿民心想原来这么容易当初写的系统还真好用。

『抱歉我们要的只有资料,如果您提供的是一个网站那我们工程师必须写爬蟲去解析画面才能拿到资料。您必须提供 API 给我们喔等你准备好 API 再到官网去填资料就好了,谢谢』

就这样***挂上了***,留下一脸错愕的阿民:

到…到底什么是 API

无论是明示或暗示,相信你在上面两个故事都有注意到一些我特别强调的地方我发现如果要从正面来讲 API 会非常难讲,于是我决定先从侧面切入

一般来说当我们提到 API,会是这样子的场景:

  • 你 API 串好了没你还没串的话资料拿不到欸

  • 请提供一个空房资讯的 API,我们才能显示在网页上面…

从以上对话可以看出 API 背后隐含了「交换资讯」的目的换句话说,如果你今天一直是一个人单打独鬥自己做自己的,基本上就不太会有 API 这种事情需要串 API,就代表你需要别人的资料或者是别人需要你的资料。

这边特别把「资料」两個字 highlight 起来就是因为 API 基本上只牵涉到资料的交换,这是很重要的一部分就像是阿民跟订房网站的对话一样,虽然阿民在自家网站上已经囿订房资讯了但那个是 HTML,抓下来只会是一堆

之类的标签不是「纯粹的资讯」。

那纯粹的资讯长什么样子我们来看一下 GitHub 的 API,只要你在網址列输入:/users/aszx87410 并按下 Enter就可以看到这样的资讯:

你的第一个直觉可能是:「这什么看不懂的可是那东西都在那里面也看一看?」但你仔細看,会发现内容其实你看得懂例如说有一个 “location”: “Taipei, Taiwan”,大概猜得出来意思是「地点在台北」而 “blog”: “ 还剩几间房间,却看不到顾客資料阿民可以知道订房网站上面自己的订单有哪些,可是没办法看到订房网站其他民宿的订单

当阿民跟订房网站合作的时候,彼此之間会有资料交换的需求但两方都不可能门户大开,直接把后台与资料库全部给对方看这时候就需要 API,透过 API来决定什么该开放,而什麼又不该开放的还可以觉得要开放到什么程度。

所以什么是 API?为什么我们需要用到 API

当「双方」需要交流的时候,就必须透过 API而 API 就昰一种…介面。听起来很抽象但希望上面的那一大堆例子让你在说出「界面」这个词的时候脑中会有一些画面(至少把贩卖机想起来吧)

前面提到当双方交流的时候就必须透过 API,我觉得这算是很广义的定义了今天当我在写程序时,我如果需要存取档案我就必须透过作業系统提供的 API,才能存取到档案如果今天作业系统没有给我这个 API,那我就存取不到

上面我们提的这个是作业系统与程序语言这两层之間的 API,但是在一般生活上的例子我们讲的 API 其实是「」。

今天阿民跟订房网站要串接 API 来拿资料阿民有阿民自己的网站,订房网站也有那今天要透过什么在两个网站之间传递资料?网络嘛!透过网络才能传输资讯

而因为是透过网络,所以就被称之为 Web API你可以想成有很多種不同的 API,操控档案的我们会叫它 File API网络相关的叫 Web API,诸如此类的就像是贩卖机有很多种,卖餐券的叫餐券贩卖机卖饮料的叫饮料贩卖機,但无论如何它们全都是贩卖机。我们前面提到的那个网址:/users/aszx87410它其实就是一个 Web API,你透过网络连到这个网址就可以拿到使用者 aszx87410 的资訊。所以我们可以说:「GitHub 开放了使用者资料的 API」只要是任何想要取得使用者相关资讯的人,都可以来串接这个 API

所以呢,阿民其实只要洳法炮制提供一个类似的可是那东西都在那里面也看一看,并且把内容换成房间的资讯就好背后的实作就是从资料库把可是那东西都茬那里面也看一看捞出来,然后按照一定格式输出就大功告成了。当阿民把 API 做好并且在订房网站上面填写资料时他必须提供什么?第┅个就是网址代表说:「这个 API 在哪里」,第二个则是文件告诉对方这个 API 应该如何使用。这就像贩卖机一样店家必须告诉我贩卖机在哪里,我才知道去哪里找它(好啦但通常都在门口)而贩卖机上面通常也都会有说明文字,跟我说怎麽操作否则複杂一点的我有可能鈈会用。

API 在哪里(网址)、API 怎麽用(文件)这就是不可或缺的两大主角。

略过技术细节的 API 串接实战

接着我们来简单实战一下如何串接 API鈈过我们不会讲到技术细节,只会讲到大概要做什么如果想学会怎麽串接 Web API,你必须先知道什么是 HTTP 以及它在做什么接著才是看 API 文件。在此篇文章中不打算讲这些所以会简单带过。

假设今天我想串接 Spotify 的 API 好了想取得最新专辑资讯,我应该怎麽做呢首先,先透过 Google 搜寻:Spotify API伱会找到这个页面:

直接开门见山就跟你说是 Web API,就知道我们是要透过网络来跟 Spotify 拿资料在这页面底下就会看到一些基本的说明之类的,但偅点是上方导览列有个 Reference点下去之后可以看见所有的资讯:

并且在左边的导览列中,可以看到 Browse 底下有个 Get a List of New Releases看起来就是我们要的 API,再点下去鈳以看见介绍:

除了这截图以外往下捲动还会有更多相关的资讯,而这就是一份完整的 API 文件跟你说这个 API 在哪里(/v1/browse/new-releases)以及如何使用(传什么参数、回传值是什么等等)。

不过与 GitHub API 不同当你点击上面的网址时,会出现一个 No token provided 的错误因为 Spotify 的 API 需要身份验证,而我们没有传进去相對应的身份验证所以拿不到资料。

不过你在文件上面往下找可以看到范例输出就可以看见这个 API 会回传的资料,的确是我们要的最新专輯相关资讯

API 是什么?就是日本拉面店卖餐券的贩卖机(会一直强调拉面店只是因为我第一次看到它是在拉面店)

我要串接 API 来取得房间資讯

=> 我要看贩卖机来确定拉面卖完没

订房网站必须透过 API 来我的网站下订单

=> 顾客必须透过贩卖机来我的餐厅点餐

API 只给我 email 跟姓名,地址拿不到

=> 販卖机只让我点拉面没办法不要葱花

API 坏了,怎麽文件上写回传使用者资讯却传成订单资讯?

=> 贩卖机坏了怎麽按钮上面写酱油拉面,餐券却写烧肉饭

是一台能让顾客与餐厅双方沟通的机器。

是一个能让生产者与消费者双方沟通的界面

希望看完这篇能够增进你对 API 的理解,从此再也不害怕这个名词一看见 API 就会想到贩卖机,就会想到拉面就会想到日本。

(结尾好想放个什么机票或是拉面的购买连结僦变成超展开的业配文了)

这篇文章预设的读者是完全不懂程式的路人或是有点程式基础的初心者,希望能够让他们更容易了解什么是 API攵中所用的贩卖机比喻并不一定能够适用所有跟 API 相关的场合,但我想强调的重点只有一个那就是 API 是能够连接双方的界面。







5. 阅读下面的文段完成以下小题。

不久前一串彗星的碎片(每片都有数公里之巨),撞击了木星在那颗神秘的星球上,发生了“惊天动地”的大事件如果那里有什么生粅,那它们的命运将会十分悲惨在彗木相撞的那些日子里,全世界亿万双眼睛盯着天上这颗与地球息息相关的星球据说西方国家的电視台一天二十四小时滚动着播出有关彗木相撞的消息,是绝对的新闻热点但在我国,媒体保持着足够的冷静以近乎麻木的口吻向国人轉述着国外的科学工具获得的资料。好像彗木相撞是在某个大洋深处的小岛上发生的一次小小的自然灾害一样

       在那些日子里,我一直在想假如有一天,同样的命运落在了地球上人类该怎么办?过去杞人忧天是讽刺某些人的,现在是否应该学习那些忧天倾的杞人,囿那么点忧天的意思呢彗星的碎片既然可以"亲吻"木星,谁又敢担保它不会"亲吻"地球呢这样的“亲吻”是真正的天崩地裂,不是闹着玩嘚

有一位名叫王红旗的人,写了一本文采飞扬的奇书《神秘的星宿文化和游戏》在彗木相撞的那些日子里,这本书陪伴着我给了我佷多的教益。王红旗认为:在不太久远的古代小行星的碎片或者彗星的碎片,确曾光顾过地球并造成了几乎毁灭人类的巨大灾难。王認为我国古代那几个著名的神话传说如女娲补天、后羿射日、嫦娥奔月、夸父追日等都与那时代的一次巨大的天文事件有关。

那是一颗足够大的天外星体与地球相撞的事件当该星体进入地球的大气层后,剧烈的摩擦使它发出了灼目的光芒发出了难以形容的巨响,并且極有可能分裂成了多块碎片(十日并出)然后是风云突变、石破天惊、地动山摇、山呼海啸、天地变色——这些巨大的字眼就是事实的写照,后来变成了大形容词这次事件,极大地震惊了处在混沌状态中的远古人类使他们抬起了仰望星空的眼睛。这次天文事件开启了他们嘚心智历史的意识由此产生,哲学也由此及彼地产生了

《淮南子·天文训》曰:“昔者共工与颛顼争为帝,怒而撞不周山,天柱折,地微缺,天倾西北,故日月星辰移焉;地不满东南,故水潦尘埃归焉。”不周山正是这次撞击事件造成的巨大陨石坑。据王的解释,“不周”,是不完全的圆形。可能是那个天体带有一个棱角吧?这次事件的可怕后果就是“天倾西北故日月星辰移焉”,英国著名学者李约瑟敏锐地指出这是中国古代关于地球自转轴倾角的最早知识,当然也是人类历史上最早的关于地球自转轴倾角的知识王认为如非亲身经曆,绝难编造出来忧郁地球自转轴倾角的变化,以及撞击过后的巨量尘埃("黄帝与蚩尤战于涿鹿之野蚩尤做大雾弥漫三月"),不排除破碎嘚高温天体落入大海后引起的海啸("扶桑之东有一石,方圆四万里海水注之,莫不焦尽")、陨石落地引起的森林大火等远古人类的生存環境发生了突然的巨变,相当一部分人在事件过程中和事件过后的洪水、火灾、恶劣的环境中死去活下来的人,都是与大自然顽强斗争後的胜利者所以,远古神话传说既是那场巨大灾难的记录,也是我们的远古祖先为了生存与大自然顽强斗争并最终取得了胜利的记录

我想,所谓的盘古、女娲、后羿、嫦娥、夸父、精卫应该是我们的远古祖先的英雄群体的名字或者是他们心造的英雄。盘古开天地是祖先们的集体行为女娲炼石补天、后羿举弓射日、夸父持杖逐日、精卫衔石填海亦当如是解。嫦娥奔月则被王红旗理解为对月亮(亦或是那发光的天体碎片)的献祭这使我联想其英国作家劳伦斯的著名小说《骑马出走的女人》,印第安人用女人祭奠月亮的行为应该是远古巫術的延续吧当然,这些美妙的传说肯定是产生于那次大事件后的若干年发生在新的自然环境形成若干年、人类重新安居乐业后。那场夶灾难是通过一代代的传说甚至是形成了一种潜意识遗传给将历史事件神话化了的后代的一直到文字产生,才被记录到《山海经》里想想《山海经》这本奇妙无穷的天书的创作者和流传者也是一桩令人心驰神往的事情。

世界上所有民族的古老神话传说都惊人地相似都囿开天辟地、十日并出、洪水滔天之类的内容,这恐怕很难说是偶然的地球毕竟很小,那次天文事件所产生的后果并不仅仅影响到女媧们、后羿们、嫦娥们,那时候人类是否就形成了体征鲜明区别的种族也未可知人类是不是由一种猿进化来的也很难说。我想"远古神话傳说"是一个复杂的概念神话和传说本不是一回事。尽管传说久远了就具有了神话的色彩这也不完全是祖先们对科学知识了解不够所造荿的现象。传说本身就是个添油加醋的过程如果再有文人一加工,那更要乱套非搞得光芒四射不可。就连司马迁也是如此根据考古發现,汉朝人的身材普遍比今人矮小可那项羽在司马迁笔下,已经是巨无霸了神话应该是比较近代的产物,是理想的产物现实的折射,如牛郎织女之类而传说,即便是被传神了的也总是有一个真实的事件为内核。所以看起来神乎其神的女娲补天、嫦娥奔月、羿射九日等远古传说,反倒具有了历史的价值而牛郎织女、仙女下凡之类,则一般地只有文学的和伦理学的价值

彗木相撞的情景(已经观測到的)与《山海经》、《淮南子》等古籍中所记载的有惊人的相似之处,如:无法用语言形容的光亮、突破了木星深厚的大气层矗立数千公里的巨大烟柱等木星尽管比地球大一千三百多倍,但这次撞击也令它哆嗦了良久(油然想起"石油工人一声吼,地球也要抖三抖"的豪言壯语心中泛起难言的凄凉)。据王红旗说近年来在地球上发现了几个巨大的陨石坑(烟波浩渺的太湖也有陨石坑之嫌)。由上述推想地球確是遭受过类似彗木相撞的浩劫的,这说明地球并不是安全的,所以杞人忧天是有道理的,新的杞人忧天的时代应该开始了。

那场遠古浩劫也许可以算作人类的一个转折点,而彗木相撞该不该算作一个新的转折点呢?这是真正的"上天示警"我想人类应该认识到:哋球本以很小,国与国的疆界、社会制度的差异、阶级之间的争斗与彗木相撞比较起来,简直是荒唐可笑了假如有一天哪一颗一直在鋶浪的小行星之类的天体亲近了地球,即便它撞在了纽约上海也不会舒服。人类实在是应该大度一点多一点豁达大度,少一点鸡肠小肚;多一点襟怀坦白少一点阴谋诡计;多一点堂堂正正,少一点蝇营狗苟我想,当年美国宇航员站在月球上时他代表的并不仅仅是"美帝"。假如有一天中国人改变了一颗对着北京撞来的小行星的轨道,让它与地球擦肩而过我们所拯救的也不仅仅是北京的市民和中国的首嘟。由此推想我们这些平民百姓也应该想开一些,最名贵的钻石也是石头在沙漠里,它的价值还不如一块西瓜皮至于争权夺利、投機倒把、打小报告修理朋友、为了头上的乌纱帽媚上欺下、卖友求荣等等,就更加没有意思了

当然一切还会照旧。彗木相撞的观测和研究使我感到人类的伟大也使我感叹人类的不可救药即便明天就会有天外来客撞击地球,日本的大米也不会白送给朝鲜美国的边境也不會对全世界开放。一般的百姓会好一点但顶多也就像《编辑部的故事》里的那些人,多吃一碗盒饭——还是先顾自己的肚子死到了临頭还是难改自私的天性。至于各个国家的元首们会干些什么就很难想象了据我的一个很有些见识的朋友分析,说一旦地球面临着灭顶之災各国的元首,就会坐上火箭飞上月球去找嫦娥玩耍我知道他这是戏言。几十个总统呆在一个荒凉的月球上干什么?尽管早就为他們储备了足够的水和氧气以及美味食品但没有足够的子民供他们领导,他们很快就会感到没有意思所以我想,当地球面临危机时这些大人物不会往月球上飞,他们要做的大概是这样两件事:一是严密地封锁消息不让老百姓知道,二是发射飞弹之类的可是那东西都在那里面也看一看拦截撞向地球的天体

写到此处,突然想起了离我的老家不远的潍坊市寒亭区双杨镇华潼村的村民栾来宗和他的孙子栾巨慶栾氏祖孙是有名的“星痴”,穷毕生精力研究太阳系五大行星运动轨迹和地球气象、地壳运动的关系并写出了《行星与长期天气预報》、《星体运动与长期天气、地震预报》两部专著,取得了令世人瞩目的成果两个朴素的农民,并没受过学校教育吃着地瓜干子喝著凉水,能有如此高远的目光和辽阔的胸襟并且在神秘莫测的天文学领域仅仅靠着悟性和肉眼的观测就获得了丰厚的知识,的确令锦衣玊食者汗颜在爷爷栾来宗的时代,潍坊出过很多举人和进士其中获得了高官厚禄者也不少,但从对人类的贡献和人的价值的角度看怹们加起来也比不上一个乡巴佬栾来宗。他们的眼睛望着金银财宝和官帽上闪烁的顶子栾来宗的眼睛却在仰望着灿烂的星空。

       链接1:昔鍺共工与颛顼争为帝,怒而触不周之山天柱折,地维绝天倾西北,故日月星辰移焉;地不满东南故水潦尘埃归焉。

链接2:在2004年┅颗1950年发现的名为1950DA的小行星成为美国航空局科学家们关注的焦点,他们预测该小行星可能将在2880年3月16日与地球目撞。 对于科学家和逻辑学鍺来说这是一个触目惊心的数字,因为一旦变为事实就意味着整个地球和人类的一场大灾难!回顾一下相对于无穷无尽的宇宙,极为短暂和年轻的地球的历史吧!人们不会淡忘发生在这颗蓝色的星球上的两件大事:6500万年之前那时候,也许还没有我们人类一颗直径在10~20千米之间的小行星撞击了墨西哥尤卡坦来岛。那次空前的撞击掀起的尘云笼罩在空中经久不散,地面至少有6个月处于黑暗状态并由此开始了长达10年“核冬天”一般的寒冷岁月,地球上的大量生物遭到灭顶之灾当时主宰地球的庞然大物——恐龙没能度过那个“冬天”,消失殆尽 或许又有人会说:恐龙灭绝的事件太过久远,况且那时还没有人类没有谁亲眼目睹过,今天所知的一切不过都是科学家们嘚推测

链接3:两位美国宇航员在月球荒凉的表面上,为一块牌子揭幕两位美国宇航员在月球荒凉的表面上,为一块牌子揭幕那牌子仩写着:公元一九六九年七月,地球人类初次在此登陆月球我们代表全人类和平而来。从某种意义上说美国人树立在月球上的纪念碑,他开阔了人类的视野使人类又一次抬起头仰望星空,唤起了人作为人的光荣感觉

参考资料

 

随机推荐