seegongsik
网络

什么是 API

天气应用是怎么知道今天天气的?它可不是自己抬头看天,而是去问存着天气数据的服务器。不过它不像人那样读网页,而是按固定的格式,只把需要的数据干净利落地取回来。这种为了让程序之间交换数据而约定好的窗口,就是 API。

01

给人看的画面,给应用用的窗口

上一课我们看到,浏览器发出请求,服务器就送回响应。人收到的响应通常是网页,文字、图片和按钮排得整整齐齐。
这对人眼很方便,可应用要从里面找出一个气温,就得把整个画面一点点拆开来看。所以程序之间不交换画面,而是交换马上就能用的数据。为此约定好的窗口,就叫 API。

点一边来比较

点一下给人看的画面和给应用用的窗口,比较一下。哪一边更方便应用使用?

同样的信息,样子却不一样。给人的是装饰得好看的画面,给应用的是没有多余东西的数据。画面是做给人读的,窗口是做给程序读的。
那么,应用怎么和这个窗口说话呢?其实很多 API 直接使用前面学过的 HTTP:向固定的地址发出请求,再收回响应。不过请求里要放什么,每个窗口都事先规定好了。

02

按固定格式提出请求

对窗口不能随便说话,得按事先定好的格式来问。比如填好固定的栏目“城市:首尔,想知道:今天的天气”再发过去。
这就像在餐厅看着菜单,按上面写的菜名点菜。点菜用的是约定好的说法,厨房就不会弄错,马上开始做。API 也只听得懂符合约定格式的请求,遇到不合格式的请求,就回一句“出错了”。

我的应用
天气 API
点一个约定好的请求发给窗口

点一下约定好的请求,把它发给 API。格式是定好的,窗口马上就能听懂。

请求发出去了,接下来该等回答了。API 不送给人看的画面,那它用什么来回答呢?
回答是整理得干干净净、应用马上就能用的数据。没有装饰也没有图片,只装着需要的值,所以体积也小。下一步就把这份数据展开,看看它长什么样。

03

用数据而不是图片来回答

API 的回答不是图片,而是名字和值成对写着的数据,比如气温是 23,天空是晴。每个值都有名字,所以一看就知道那个值是什么。
像这样把名字和值配对来写的格式里,用得最广的是 JSON。它简单到人也能读懂,程序处理起来也方便。应用从这份数据里只挑出需要的值,画到自己的画面上。

点一下把数据展开。回答的不是图片,而是干净利落的名字和值(气温 23,晴)。

每个值都有名字,应用就不会弄混。要气温就取气温,要天空的情况就取天空的情况。要是得从画面里把数字找出来,网页的样子稍微一变,应用就可能读错值。
而且这样的窗口不止一个。地图窗口、天气窗口、支付窗口,世界上开放着数不清的 API。把两个以上合在一起用,能做出什么呢?

04

把窗口组合成新服务

每个窗口只做一件事。地图窗口告诉你位置和地图,天气窗口告诉你天气。
可是把两个组合起来,就出现了一个在地图上显示各处天气的新服务。就像拼积木一样,把几个窗口凑在一起,做出更大的东西。我们每天用的应用里,有不少就是这样把好几家公司的窗口组合起来做成的。

+
把两个窗口都打开来组合

依次点地图 API 和天气 API,把它们组合起来。两个合在一起,就成了在地图上显示天气的新服务。

两个窗口的数据一碰头,就出现了单靠一个做不到的事。地图和天气都不是从零做起的,只是借来现成的窗口合在了一起。
所以新服务能做得很快:不用重新发明轮子,拿做好的零件来用就行。开放窗口的一方需要知道谁用了多少,所以很多 API 要求每个请求都附上一串像钥匙一样的专属字符串。

05

小结

用一句话概括:人看的是画面,程序之间交换的是数据,为此约定好的窗口就是 API。
按固定格式提出请求,它就用名字和值组成的数据来回答,而不是图片。把几个窗口组合起来,就成了新服务。所以我们不必什么都从零做起,可以借用现成的窗口做出新东西。

依次点这一讲教的东西来收尾

依次点要点回顾一下。(给应用用的窗口 → 按固定格式请求 → 用数据回答 → 组合成新服务)

现在你知道应用之间是怎样交换数据的了。看得见的一个应用背后,有许多窗口在默默工作。下次打开天气应用时,想一想这个画面是从哪个窗口取回了什么数据,也挺有意思。
不过前面说过,HTTP 不记得以前的请求。那么,网店是怎么在每一页都认出已经登录的你呢?下一课就讲这个问题的答案:会话和 Cookie。

一句话总结人用眼睛看网页(HTML),应用之间交换的却不是画面,而是数据。为了按固定格式交换这些数据而约定好的窗口,就是 API。按约定的格式发出请求(比如“首尔今天的天气”),它就用干净利落的数据(像气温 23、晴这样的名字和值)来回答,而不是图片,所以别的应用能马上用这些数据。把几个 API 组合起来,还能做出新服务:在地图 API 上叠加天气 API,地图上就会显示天气。我们用的许多应用,其实都是把从好几个窗口取回的数据合在一起给我们看。
← 网络
如果有帮助,请支持我们