共计 4362 个字符,预计需要花费 11 分钟才能阅读完成。
看到 API 你会想起什么?是接口、第三方调用、还是 API 文档?初看你可能会觉得这太熟悉了,这不是系统开发日常系列吗?但你仔细想一想,你会发现 API 的概念在你脑海里是如此的模糊。如果你通过搜索引擎检索 API,你会看到类似这样的信息:API——Application Programming Interface(应用程序编程接口),这太抽象了。接下来,我将结合在开发中总结的一些经验,以通俗的方式聊聊 API、REST API、RESTful API 以及 Web Service 这四者之间的联系与区别。
1、API 与 REST API
什么是 API? 这里引述维基百科给出的定义:应用程序接口 (英语:Application Programming Interface,缩写:API;又称为 应用编程接口)是软件系统不同组成部分衔接的约定。这个对 API 的定义太过于广泛和抽象,而通俗的讲,API 是一段应用程序与另一段应用程序相互“交流”的方式(协议)。在 Web 应用程开发中,API 是我们通过网络进行数据检索的一种主要方式,API 文档将告知你检索数据的 URL 列表、查询参数、请求方式以及响应状态,其目的是降低 Web 应用程序开发难度,共享两个应用程序之间的数据(文本、音频、视频、图片等),而屏蔽其内部复杂的实现细节。
REST 是 Representational State Transfer 的缩写,直译过来就是:表述状态的转移。REST API 是一组关于如何构建 Web 应用程序 API 的架构规则、标准或指导,或者说 REST API 是遵循 API 原则的一种架构风格。REST 是专门针对 Web 应用程序而设计的,其目的在于降低开发的复杂度,提高系统的可伸缩性。下面是设计 REST 风格的系统架构时需要满足或者遵循的一些基本条件和原则:
- 1、在 REST 架构中,Web 中所有的事物(文本、音频、视频、图片、链接)都可以被统一的抽象为资源(resource)
- 2、在 REST 架构中,每一个资源都有与之对应的唯一资源标识符(resource identifier), 当资源的状态发生改变时, 资源标识符不会发生改变
- 3、在 REST 架构中,所有的操作都是无状态的。REST 架构遵循 CRUD 原则,所有的资源都可以通过 GET、POST、PUT 和 DELETE 这四种行为完成对应的操作。
- 4、可缓存(可选项),在 REST 架构中需要缓存来有效的处理大批量的请求
- 5、接口一致
现在,了解了 API 和 REST API 的基本概念,那这两者之间有什么异同?如果按照数学上集合的概念来解释 API 与 REST API 之间的联系与区别,API 是 REST API 的超集,REST API 是 API 的子集;所有的 REST API 都是 API,但不是所有的 API 都是 REST API。更通俗的解释是:所有的男人都是人,但不是所有的人都是男人。
2、REST API 与 RESTful API
在第一小节中,了解了什么是 REST API,接下来聊聊 REST API 与 RESTful API 之间的异同。很多初学者很容易将这两者等同起来,认为 RESTful API 就是 REST API,这可能是单纯的从字面上去理解了,当你深入的去了解两者的本质后,你会发现其实不然。REST API 是 Web API 设计的一种规范或者指导原则,而 RESTful API 则是这中架构设计原则或者规范的一种具体实现方式。也就是说,RESTful API 是 REST API 的非正式实现方式,因为实现 REST API 的方式有很多,RESTful API 只是其中一种,且没有完全满足 REST API 的所有设计原则,每个开发者在实现 REST 架构时的则重点都会有差别。
很多初学者容易将 REST API 与 RESTful API 两者的概念搞混淆,我想可能只是看字面意思,而没有关注它们本身的含义(就像认识中文字一样,有边读边,无边读中间,断章取义了)。这就好比很多人会把变性人等同于女人,变性人可能五官的表象看起来和女人一样,但变性人不能生育,它只是满足了定义一个女性的大多数条件(实现),但本质上不是女人。
接下来,通过一个简单的例子以加深对 REST API 和 RESTful API 的理解。下面将给出一个执行 CURD 操作的 RESTful API 设计案例:
说明:resource 代指某种资源的名称,可以时 student(学生)、teacher(老师)、book(书籍)等等,通常使用名词来表示;{id}则代指某种资源的唯一标识符(resource identifier)
下面是一个具体的小例子,以学生管理为例,设计学生管理的 API。学生资源包括 ID,姓名和所学课程信息,学生资源信息如下:
现在,我们需要将学生数据保存到数据库,然后执行查询、修改和删除学生数据的操作。学生管理 API 的使用者调用的 API 如下:
- 1、创建学生资源:[POST] http://www.example.com/student
- 2、获取所有学生资源:[GET] http://www.example.com/students
- 3、获取 ID=1001 的学生资源:[GET] http://www.example.com/studen…
- 4、修改 ID=1001 的学生资源:[PUT] http://www.example.com/studen…
- 5、删除 ID=1001 的学生资源:[DELETE] http://www.example.com/studen…
前面的内容说到,API 共享数据资源,而屏蔽内部实现,API 的使用者(客户端)关注的是资源(读懂数据), 并不需要了解 API 内部构造;API 的提供者(服务端)只关注自己的内部实现,而不关系 API 使用者(客户端)的状态。为了加深对这一概念的理解,下面给出学生管理 API 的内部实现示例:
说明:
示例代码是基于 Spring MVC 进行实现的。
除了上述的内容之外,你还可以通过提供键值对的方式对查询数据进行过滤,如获取所有的学生数据时,只想获取性别为女性的学生数据,则可以通过这样的方式来完成:
[GET] http://www.example.com/students?gender=female
Tip:如果 API 拥有对数据过滤的功能,对应服务端的 API 实现代码也需要做调整。
在前面的内容中,我们提到 RESTful API 是 REST API 的非正式实现方式或规范。为什么这么说呢?因为在 RESTful API 的设计中,我们完全可以通过 GET 的方式完成 CURD 操作,也可以通过 DELETE 行为来创建资源,通过 POST 行为来修改资源,它的实现方式并不严谨或者说并没有严格按照 REST API 提出的约束条件来进行。所以说RESTful API 是 REST API 的非正式实现方式。
3、REST 与 Web Service
3-1、什么是 Web Service?
如万维网联盟(W3C)所述,Web Service 提供了在各种平台和 / 或框架上运行的不同软件应用程序之间可以进行互操作的标准方法。Web Service 的特点是具有良好的互操作性和可扩展性,以及由于使用 XML 而可以对程序处理过程进行描述。它们可以以松散耦合的方式组合不同的服务以实现复杂的操作。提供简单服务的程序可以通过相互交互,以提供复杂的增值服务。
两个 Web Service 之间主要通过 HTTP 网络协议进行通信,如我们熟知的 SOA(面向服务的体系架构),主要依赖于 XML-RPC 和 SOAP(Simple Object Access Protocol,即简单对象访问协议)。
Tip:千万不要将 SOA(面向服务体系架构)和 SOAP(简单对象访问协议)搞混,前者是一种架构设计形式,后者是一种数据交换协议。
简单的一个示例:假设一个 Web Service A 提供允许其他应用程序通过 URL 获取用户信息的功能:[GET] http://www.abc.com/{id}。id 是用户的唯一标识符,请求此 URL 将获得用户信息。现在假设浏览器、手机、桌面应用程序的用户都要获取服务 A 提供的用户信息,这三者只需要请求服务 A 提供的 URL 地址,并输入用户 id 信息即可。至于者三个不同客户端的实现方式(编程语言)是什么与服务 A 没有任何关系,只要能够解析出服务 A 返回的 XML 文档即可。这样,应用程序之间交换数据就可以不用依赖于具体的语言和环境。这就好比不同国家不同语言的人,只要能够知晓对方语言的语法结构,两个人就可以进行交流。
3-2、Web Service 的优点
使用 Web Service 有如下的几个优点:
- 1、互操作性:Web Service 允许应用程序之间进行通信,交换数据和共享服务。
- 2、可用性:Web Service 的功能可以从简单的信息查找到复杂的算法计算。
- 3、可重用性:Web Service 之间可以相互组合,以提供更为复杂的服务,由于其互操作性的特点,可以轻松的在其他的服务中重用 Web Service 组件, 提高了服务的重用率。
- 4、易于部署:Web Service 可以部署在基于 Internet 标准的容器中,如 Apache、Axis2 等,以提供 HTTP 或者 WSDL(网络服务定义语言)驱动的服务。
- 5、成本低:Web Service 是通过打包成 Web 服务组件进行部署,从而降低了使用的成本。
3-3、Web Service 的类型
目前,Web Service 主要有两大流派:
- 1、基于 SOAP 的 Web Service : SOAP(简单对象访问协议)是一种基于 XML 的协议,用以访问 Web Service。其接口以机器可处理的格式进行描述,称为 WSDL(Web 服务定义语言)文档。通过使用标准的的 XML 文档来描述 Web Service,在 XML 文件中,会详细记录接口的信息,如消息的格式、传输协议以及交互的位置等信息。
- 2、基于 REST 的 Web Service:REST(Representational State Transfer)是一种软件架构,它使用 JSON 来描述数据格式,最重要的是 HTTP 传输协议对 REST 来说是非必须的。
3-4、REST 与 SOAP 的区别和联系
下面,通过一张表格来对比 REST 与 SOAP 之间的异同:
总结
如上所述,我们了解了什么是 API,什么是 REST API, 什么是 RESTful API 以及 Web Service 的相关概念。API 代表应用程序编程接口,是一种较为宽泛的定义或者说是一种协议,作为软件程序之间相互通信的接口而存在。REST API 是 API 的一个子集,所有的 REST API 都是 API;RESTful API 是对 REST API 架构风格的一种非正式实现方式。API 与 Web Service 都是服务提供者和服务消费者之间的通信手段。最后,为了能够快速的识别 API 与 Web Service 之间的差异,将这两种手段的不同之处整理成对照表如下: