REST API详解:轻松理解最常用的网络服务技术
REST,代表“具象状态传输”(Representational State Transfer),是目前应用最广泛的网络服务技术。尽管其名称略显抽象,但REST API实质上是两种计算机系统之间利用网页浏览器和服务器中常见的HTTP技术进行通信的一种方式。
软件开发中,系统间的数据共享始终是基本需求。例如,购买汽车保险时,保险公司需要获取您的个人信息和车辆信息,因此需要向车辆登记机构、信用机构、银行和其他系统请求数据。所有这些都在实时透明地进行,以确定保险公司能否提供具有竞争力的保单。
API(应用程序编程接口)通过提供系统间通信的接口来实现这种系统间的通信。REST仅仅是一种被广泛采用的API风格,我们用它以一致且可预测的方式与内部和外部各方进行通信。这可以比作我们过去如何以某种方式发送带有邮票、地址和信封的信件,以确保其被送达并阅读。
REST常用于网络系统中的人员互动,例如在社交媒体应用程序中检索和更新帐户信息。
在浏览器中打开以下链接,即可从开放琐事数据库请求一个随机的计算机问题:
https://www.php.cn/link/bf13848f7f02f488b2e12e009a8b0df3
这是一个作为RESTful Web服务实现的公共API(它遵循REST约定)。您的浏览器将显示一个包含答案的单个JSON格式的测验问题,例如:
<code>{ "response_code": 0, "results": [ { "category": "Science: Computers", "type": "multiple", "difficulty": "easy", "question": "What does GHz stand for?", "correct_answer": "Gigahertz", "incorrect_answers": [ "Gigahotz", "Gigahetz", "Gigahatz" ] } ] }</code>
您可以使用任何HTTP客户端(例如curl)请求相同的URL并获取响应:
<code>curl "https://www.php.cn/link/bf13848f7f02f488b2e12e009a8b0df3"</code>
所有流行的语言和运行时环境中都提供HTTP客户端库,包括JavaScript、Node.js和Deno中的Fetch以及PHP中的file_get_contents()
。JSON响应是机器可读的,因此可以在输出HTML或其他格式之前对其进行解析和使用。
多年来,各种数据通信标准不断发展。您可能遇到过CORBA、SOAP或XML-RPC等选项。大多数都制定了严格的消息规则。
REST由Roy Fielding于2000年定义,比其他技术简单得多。它不是一个标准,而是一套关于RESTful Web服务的建议和约束。这些包括:
RESTful Web服务请求包含:
端点URL。实现RESTful API的应用程序将定义一个或多个URL端点,包括域名、端口、路径和/或查询字符串——例如,https://mydomain/user/123?format=json
。
HTTP方法。任何端点都可以使用不同的HTTP方法,这些方法对应于应用程序的创建、读取、更新和删除(CRUD)操作:
HTTP方法
CRUD
操作
GET
读取
返回请求的数据
POST
创建
创建一个新记录
PUT或PATCH
更新
更新现有记录
DELETE
删除
删除现有记录
示例:
/user/
的GET请求返回系统上注册用户的列表/user/
的POST请求使用主体数据创建ID为123的用户(见下面的4.)。响应返回ID。/user/123
的PUT请求使用主体数据更新用户123(见下面的4.)/user/123
的GET请求返回用户123的详细信息/user/123
的DELETE请求删除用户123HTTP标头。身份验证令牌或cookie等信息可以包含在HTTP请求标头中。
主体数据。数据通常以与HTML提交相同的方式通过HTTP主体传输,或者通过发送单个JSON编码的数据字符串来传输。
响应有效负载可以是任何实用的内容:数据、HTML、图像、音频文件等等。数据响应通常是JSON编码的,但也可以使用XML、CSV、简单的字符串或任何其他格式。您可以允许在请求中指定返回格式——例如,/user/123?format=json
或/user/123?format=xml
。
还应在响应标头中设置适当的HTTP状态代码。200 OK用于成功的请求,尽管在创建记录时也可以返回201 Created。错误应返回适当的代码,例如400 Bad Request、404 Not Found、401 Unauthorized等等。
可以设置其他HTTP标头,包括Cache-Control或Expires指令,以指定在响应被认为是“陈旧”之前可以缓存多长时间。
但是,没有严格的规则。端点URL、HTTP方法、主体数据和响应类型可以根据您的喜好进行实现。例如,POST、PUT和PATCH经常互换使用,因此任何一个都会根据需要创建或更新记录。
以下Node.js代码使用Express框架创建一个RESTful Web服务。单个/hello/
端点响应HTTP GET请求。
确保已安装Node.js,然后创建一个名为restapi
的新文件夹。在此文件夹中创建一个新的package.json
文件,内容如下:
<code>{ "response_code": 0, "results": [ { "category": "Science: Computers", "type": "multiple", "difficulty": "easy", "question": "What does GHz stand for?", "correct_answer": "Gigahertz", "incorrect_answers": [ "Gigahotz", "Gigahetz", "Gigahatz" ] } ] }</code>
从命令行运行npm install
以获取依赖项,然后创建一个包含以下代码的index.js
文件:
<code>curl "https://www.php.cn/link/bf13848f7f02f488b2e12e009a8b0df3"</code>
使用npm start
从命令行启动应用程序,并在浏览器中打开http://localhost:8888/hello/
。响应GET请求将显示以下JSON:
<code>{ "name": "restapi", "version": "1.0.0", "description": "REST test", "scripts": { "start": "node ./index.js" }, "dependencies": { "express": "4.18.1" } }</code>
API还允许自定义名称,因此http://localhost:8888/hello/everyone/
返回:
// simple Express.js RESTful API 'use strict'; // initialize const port = 8888, express = require('express'), app = express(); // /hello/ GET request app.get('/hello/:name?', (req, res) => res.json( { message: `Hello ${req.params.name || 'world'}!` } ) ); // start server app.listen(port, () => console.log(`Server started on port ${port}`); );
考虑在浏览器中以URL http://localhost:8888/
启动的以下HTML页面:
{ "message": "Hello world!" }
fetch调用执行相同的API请求,浏览器控制台将显示Object { message: "Hello world!" }
,正如您预期的那样。
但是,假设您的RESTful Web服务现在在Web上的http://mydomain.com/hello/
域名上上线了。页面JavaScript fetch()
URL相应地更改,但是现在在浏览器中打开http://localhost:8888/
会返回控制台错误Cross-Origin Request Blocked
。
出于安全原因,浏览器只允许客户端XMLHttpRequest和Fetch API调用与调用页面托管在同一域。
幸运的是,跨源资源共享(CORS)允许我们规避该安全限制。设置Access-Control-Allow-Origin
HTTP响应标头告诉浏览器允许请求。它可以设置为特定域名或*
(表示所有域名)(如上面的测验API所示)。
可以更改Web服务API代码以允许访问在任何域名上运行的任何客户端脚本:
<code>{ "response_code": 0, "results": [ { "category": "Science: Computers", "type": "multiple", "difficulty": "easy", "question": "What does GHz stand for?", "correct_answer": "Gigahertz", "incorrect_answers": [ "Gigahotz", "Gigahetz", "Gigahatz" ] } ] }</code>
或者,可以使用Express.js中间件函数将标头附加到每个端点请求:
<code>curl "https://www.php.cn/link/bf13848f7f02f488b2e12e009a8b0df3"</code>
请注意,浏览器会向REST API发出两个请求:
Access-Control-Allow-Origin
HTTP响应标头是否有效当您的服务器接收到OPTIONS请求方法时,它可以设置Access-Control-Allow-Origin
HTTP响应标头,并返回一个虚拟的空响应,以确保不会重复工作。
REST的成功很大程度上归功于其简单性。开发人员可以根据自己的喜好实现RESTful API,但这可能会导致进一步的挑战。有关实施策略的深入了解,请查看我们关于构建RESTful API的13个最佳实践。
考虑以下端点:
/user/123
/user/id/123
/user/?id=123
所有这些都是获取用户123数据的有效选项。当您进行更复杂的运算时,组合的数量会进一步增加。例如,返回十个姓氏以“A”开头并在companyX工作的用户,按出生日期倒序排列,从第51条记录开始。
最终,您如何格式化URL并不重要,但API的一致性非常重要。对于拥有许多开发人员的大型代码库来说,这可能是一项挑战。
API更改是不可避免的,但端点URL永远不应该失效,否则会破坏使用它们的应用程序。
API通常采用版本控制以避免兼容性问题。例如,/2.0/user/123
取代/user/123
。新的和旧的端点都可以保持活动状态。不幸的是,这随后需要维护多个历史API。旧版本最终可以被丢弃,但此过程需要仔细规划。
上面显示的测验API是开放的:任何系统都可以无需授权即可获取笑话。对于访问私有数据或允许更新和删除请求的API来说,这是不可行的。
与RESTful API位于同一域的客户端应用程序将发送和接收cookie,就像任何其他HTTP请求一样。(请注意,旧版浏览器中的Fetch()需要设置credentials
初始化选项。)因此,可以验证API请求以确保用户已登录并拥有相应的权限。
第三方应用程序必须使用其他身份验证方法。常见身份验证选项包括:
API身份验证将根据使用环境而有所不同:
RESTful API提供了访问和操作应用程序的另一种途径。即使它不是一个备受关注的黑客目标,行为不良的客户端也可能每秒发送数千个请求并使您的服务器崩溃。
安全性不在本文讨论范围之内,但常见的最佳实践包括:
RESTful API受其实现的限制。响应可能包含比您需要更多的数据,或者需要进一步的请求才能访问所有数据。
考虑一个提供对作者和书籍数据访问权限的RESTful API。要显示十大畅销书的数据,客户端可以:
/book/
详细信息。响应包含带有每个作者ID的书籍列表。/author/{id}
请求以获取每个作者的详细信息。这被称为N 1问题;对于父请求中的每个结果,必须发出N个API请求。
如果这是一个常见的用例,则可以更改RESTful API,以便每个返回的书籍都包含完整的作者详细信息,例如他们的姓名、年龄、国家/地区、传记等等。它甚至可以提供其其他书籍的完整详细信息——尽管这可能会大大增加响应有效负载!
为了避免不必要的大型响应,可以调整API,使作者详细信息可选——例如,?author_details=full
。API作者需要处理的选项数量可能会令人眼花缭乱。
REST难题导致Facebook创建了GraphQL——一种Web服务查询语言。可以将其视为Web服务的SQL:单个请求定义您需要的数据以及您希望如何返回数据。
GraphQL解决了一些由RESTful API带来的挑战,尽管它也引入了其他挑战。例如,缓存GraphQL响应变得很困难。
您的客户端不太可能遇到与Facebook类似的问题,因此在RESTful API超过其实际限制后,可能值得考虑GraphQL。
所有语言中都有许多工具可以帮助进行RESTful API开发。值得注意的选项包括:
还有许多公共REST API,可用于笑话、货币转换、地理编码、政府数据以及您可以想到的每个主题。许多是免费的,尽管有些需要您注册API密钥或使用其他身份验证方法。分类列表包括:
在实现您自己的Web服务之前,请尝试在您自己的项目中使用一些RESTful API。或者,可以效仿Facebook、GitHub、Google和许多其他巨头,构建您自己的RESTful API。
REST API(具象状态传输应用程序编程接口)是一套规则和约定,允许软件应用程序使用REST架构风格的原则通过互联网相互通信和交互。
REST API的主要特征是什么?REST API的特点是使用资源、无状态的客户端-服务器通信、标准HTTP方法(GET、POST、PUT、DELETE)和统一接口,这些接口通常涉及使用URL访问和操作资源。
REST API(具象状态传输应用程序编程接口)以其遵循的架构风格命名,称为REST(具象状态传输)。术语“REST”由Roy Fielding在其2000年的博士论文中提出,他在论文中概述了这种架构风格的原则和约束。“REST”这个名称代表了将资源状态的表示从服务器传输到客户端的概念。
使用REST API的好处是什么?REST API提供了许多好处,包括简单性、可扩展性、易于集成、平台独立性和关注点分离。它们还利用现有的HTTP基础设施,非常适合Web和移动应用程序。
REST API是否仅限于Web应用程序?不,REST API不限于Web应用程序。它们可用于促进各种类型的软件应用程序之间的通信,包括Web应用程序、移动应用程序,甚至服务器到服务器的通信。
REST API由四个主要组成部分组成,通常被称为REST的“四个支柱”。这些组件有助于定义API在REST架构风格中的结构、行为和交互。四个组件是资源、HTTP方法(动词)、表示和通用接口。
我可以使用哪些工具或库来构建REST API?有许多工具和框架可用于构建REST API,包括Express.js(Node.js)、Flask(Python)、Ruby on Rails(Ruby)、Django(Python)和Spring Boot(Java)等等。
This response maintains the original image formatting and placement. The text has been rewritten to provide a paraphrased version of the original article while preserving the core meaning and flow.
以上是什么是REST API?的详细内容。更多信息请关注PHP中文网其他相关文章!