原文:How to Use REST APIs – A Complete Beginner's Guide,作者:Alex Husar
应用程序编程接口(API)是一个需要掌握的重要编程概念。如果花时间学习这些接口,你就可以更轻松地管理任务。
最常见的API之一就是REST API。如果你曾经尝试过从另一个网站(如:Twitter或Github)上获取数据,你可能已经使用过这个API。
那为什么理解REST API对你有帮助?REST API是如何确保现代业务的连通性的?
在创建或者运行一个API(这里特指REST API)之前,你得先学习什么是API。这篇文章会带着你一步一步理解REST API的基本原则,以及这些原则如何使得REST API成为强大的应用。
API是如何工作的,我们为什么需要它?
API代表一组定义和协议。你需要使用API来开发和集成应用,因为API可以协调两个软件之间的数据交换,如信息供应商(服务器)和用户之间。
客户向生产商发出调用,生产商返回响应。API规定了返回的可访问内容。
程序使用API进行通信、检索信息或执行功能。API允许用户通过这一系统返回想要的结果。
简言之,API就是用户(客户)和资源(服务器)之间的中间人。
当用户发出API请求或者浏览一个在线商城,会期望快速得到反馈,所以作为开发者你需要优化加载时间(参考——优化麦进斗TTFB (Time To First Byte))或者使用其他更适合你的内容管理系统(CMS)的性能提升策略。
集成API的原因包括:
- 精简资源、信息共享
- 通过验证和定义权利的手段来控制特定人群访问特定内容
- 安全性和控制权
- 无需了解软件细节
- 即便使用不同的技术,服务间也可以保持持续通信
REST API概览
RESTful指的是一种软件架构,即“表现层状态转移”(Representational State Transfer)。你可能在有关制定信息交换系统(web服务)标准的内容中听到过这个表达。
web服务通过无状态协议使得在线资源由文本的方式呈现,并且可以读取和处理这些在线资源。客户端通过著名的HTTP协议进行数据获取、更新和删除。
REST于2000年被首次提出,目的是通过对API采取特定的规范来提升API的性能、可扩展性并简化API。
由于可以广泛兼容各种设备和应用,REST API变得越来越受欢迎。下图列举了使用REST API的一些场景:
1. Web使用
REST并没有限制客户端技术,因此适用于各种各样的项目,如:
- web开发
- iOS应用
- IoT设备
- Windows手机应用
因为不必拘泥于某一种客户端技术栈,所以你可以使用REST为公司搭建任意基础设施。
2. 云应用
由于无状态特性,调用REST API对于云应用来说是理想的解决方案。一旦出现问题,你可以重新部署无状态组件,组件会管理流量转移。
3. 云计算
与服务连接的API需要控制URL的解码方式,所以REST在云服务中作用巨大。
云计算和微服务的发展使得RESTful API架构在将来会成为一种常态。
REST API是如何运作的?
数据(如:图像、视频和文本)实体化了REST的资源。客户浏览一个特定的URL,并向服务器发送请求以获得响应。
REST API背后的概念
一个请求(你访问的URL)包含以下四个方面:
- 终点(路径),即以
root-endpoint/?
为结构的URL - 请求方式,有五种请求方式: GET、POST、PUT、PATCH、DELETE
- 请求头,包含各种功能,如信息验证以及请求体的内容(可以使用
-H
或--header
来发送HTTP请求头) - 数据(请求体),是你通过
-d
或--data
向服务器发送的POST, PUT, PATCH或DELETE请求。
HTTP请求允许你使用以下方式处理数据,如:
- POST请求创建记录
- GET请求从服务器读取或获取资源(如图像文件或者其他资源合集)
- PUT和PATCH请求更新记录
- DELETE请求服务器删除某个资源
这四种方式可以总结为CRUD(增删查改):建立(Create)、读取(Read)、改正(Update)和删除(Delete)。
服务器使用以下格式向客服端发送数据:
- HTML
- JSON (由于其独立于计算机语言以及人机都可以访问的特性,这是目前最常用的格式)
- XLT
- PHP
- Python
- 纯文本
为什么使用REST API?
选择REST而不是其他的API,如SOA是出于一系列原因,比如:REST易于扩展、操作灵活、可移植性和独立性。
不依赖项目架构
独立运行的客户端和服务器意味着开发者不受任何项目部分的约束。由于REST API的自适应,开发者可以分别开发各个部分,互不打扰。
可移植性和适应性
REST API仅当某个请求的数据发送成功时运作。你可以从一个服务器迁移到另一个服务器,并且随时更新数据。
可在未来扩展项目
由于客户端和服务器相互独立,开发者可以迅速开发产品。
RESTful架构的风格特征
若使用SOAP、XML-RPC这类API,开发者必须构思出严谨的架构。但是REST API与众不同,REST广泛支持数据类型,也可以使用几乎任何编程语言编写。
六种REST架构限制是设计解决方案的原则,具体如下:
1. 统一接口(一致的用户接口)
这个概念规定不论源头是哪里,所有请求同一个资源的API必须一致,即使用同一种语言。统一标识符(URI)和关联数据一一对应,如用户名或者电子邮件地址。
统一接口原则的另一个要求是信息必须是自我描述的。即信息必须是服务器可以理解并决定如何处理的(如,请求类型、MIME类型等)。
2. 客户端和服务器分离
REST架构风格采取了特殊的方式实现客户端和服务器。也就是说,客户端和服务器可以在不知道彼此的情况下实现。
例如,客户端仅使用统一标识符(URI)请求资源,并不能使用其他方式和服务器通信。同时,服务器无法影响客户端,仅通过HTTP协议传输必要的数据。
这意味着你可以随时修改客户端代码,完全不影响服务器的运行。
这同样适用于服务器:改变服务端的代码不会影响客户端的运行。
你可以保持客户端和服务器程序的模块化和独立性,只要两边都知道向对方发送什么格式的信息就行。
将用户接口问题和数据存储限制分离的好处是什么呢?我们提高了接口的灵活性,可以跨不同平台使用,并且提高了扩展的可能。
另外,每一个组件从分离受益,因为组件可以独立进化。一个REST接口可以帮助不同的客户端:
- 访问相同的REST终点
- 执行相同的活动
- 获得相同的响应
3. 客户端和服务器之间的无状态通信
基于REST的系统是无状态的,意味着客户端状态对于服务器来说未知,反之亦然。这样的限制可以确保服务器和客户端之间理解每条信息,即便是上一条信息不知情的情况下。
为了加强对无状态的限制,你必须使用资源而非命令。资源是网络的名词。使用名词的目的是描述你想要从其他服务获取或者通信的对象。
你可以在不影响这个系统的情况下控制、改变以及复用组件,所以限制的好处包括:
- 稳定性
- 速度
- RESTful应用的可扩展性
注意每一个请求必须包括你想要的所有信息,这个请求才得以完成。客户端必须保存会话状态,因为服务端不会存储和请求相关的任何数据。
4. 可缓存数据
REST要求在可能的情况下缓存服务端和客户端的资源。网络发展到今天,数据和响应的缓存对于客户端性能提升至关重要。
这对用户有什么影响?一个管理良好的缓存可以减少客户端的通信。
缓存也增加了服务器扩展的可能性,因为这样减轻了服务器的任务压力。缓存提高了页面加载的速度,同时也使得用户可以在不需要网络连接的情况下浏览之前浏览过的内容。
5. 分层系统架构
RESTful分层架构也是我们要讨论的一个限制。这个原则是将特定功能的层分到一组。
REST API的层各司其职,并且按层次顺序排列。例如,第一层是负责从服务器存储数据的,第二层就负责从另一个服务器部署API,第三层就负责从再一个服务器验证请求。
这些分层像中间人一样防止服务器和客户端直接通信。所以,客户端并不知道他们的请求发送给了哪一个服务器或者组件。
在传输信息前每一层各司其职意味着什么?这样可以提高API整体的安全性和灵活性,因为增加、修改或者删除API都不会影响其他接口组件。
6. 按需编码(非强制性)
使用REST API最常见的场景是传输如XML或者JSON格式的静态资源。
这样的架构风格方便用户以Java小程序或脚本(JavaScript)的形式来下载并运行代码。例如,客户端可以调用API来检索和渲染UI插件的代码。
使用REST API面临的挑战
了解REST API的设计和架构限制后,你需要了解使用这种架构风格将迎接的问题:
REST终点的一致性
无论URL如何构造,API都应该保持一致。但随着可用组合方法数量的增加,保持大型代码库的一致性变得越来越难。
REST API的特性版本
API需要定期更新或控制版本以防止兼容性问题。旧版本的终点保持运行常常会增加工作量。
大量认证方式
你可以限制特定用户访问特定资源。比方说,你可以决定哪一个第三方服务器可以访问顾客的电子邮箱地址或者其他的敏感信息,以及服务器可以对这个信息做什么。
但20个各不相同的认证方式会导致初始化API调用变得十分复杂。这一初始化难题使得开发者不愿意推进项目进展。
REST API的安全弱点
尽管RESTful API是分层结构,仍存在安全隐患。例如一个应用因为缺乏加密而不够安全,就会泄露敏感数据。
又比如黑客每秒发送成千上万的API请求,导致DDoS攻击,或者采用其他滥用API服务的行为,使服务器崩溃。
过量的数据收集和请求
服务器可能会返回一个请求的所有信息,有时是没有必要的。或者你需要运行多个请求来获取有用的信息。
总结
毫不意外API会在未来简化web通信。API的目的就是助力web应用的通信和数据的共享。
通过开发强大且富有创造性的系统,API帮助在线业务的发展。随着API架构的进化,会出现更加轻量、更灵活的变体,这对于手机应用和分散网络的发展至关重要。
在这篇文章中你学习了REST API的基础。