首页 > web前端 > js教程 > 什么是REST API?

什么是REST API?

尊渡假赌尊渡假赌尊渡假赌
发布: 2025-02-09 12:37:09
原创
370 人浏览过

What Is a REST API?

REST API详解:轻松理解最常用的网络服务技术

REST,代表“具象状态传输”(Representational State Transfer),是目前应用最广泛的网络服务技术。尽管其名称略显抽象,但REST API实质上是两种计算机系统之间利用网页浏览器和服务器中常见的HTTP技术进行通信的一种方式。

软件开发中,系统间的数据共享始终是基本需求。例如,购买汽车保险时,保险公司需要获取您的个人信息和车辆信息,因此需要向车辆登记机构、信用机构、银行和其他系统请求数据。所有这些都在实时透明地进行,以确定保险公司能否提供具有竞争力的保单。

API(应用程序编程接口)通过提供系统间通信的接口来实现这种系统间的通信。REST仅仅是一种被广泛采用的API风格,我们用它以一致且可预测的方式与内部和外部各方进行通信。这可以比作我们过去如何以某种方式发送带有邮票、地址和信封的信件,以确保其被送达并阅读。

REST常用于网络系统中的人员互动,例如在社交媒体应用程序中检索和更新帐户信息。

关键要点

  1. REST API利用HTTP促进计算机系统之间的通信,使各种服务(如车辆登记机构、信用机构和银行)能够实时共享数据,从而提供汽车保险报价等服务。
  2. REST API遵循一套创建网络服务的建议,包括客户端-服务器架构、无状态性、可缓存性和分层系统,使其成为与网络系统交互的一种简单而有效的方法。
  3. REST API的实现和使用需要考虑端点一致性、版本控制、身份验证、安全性以及处理多个请求或不必要的数据等问题,Swagger和Postman等工具支持开发和测试。

REST API示例

在浏览器中打开以下链接,即可从开放琐事数据库请求一个随机的计算机问题:

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或其他格式之前对其进行解析和使用。

REST API与其他技术

多年来,各种数据通信标准不断发展。您可能遇到过CORBA、SOAP或XML-RPC等选项。大多数都制定了严格的消息规则。

REST由Roy Fielding于2000年定义,比其他技术简单得多。它不是一个标准,而是一套关于RESTful Web服务的建议和约束。这些包括:

  • 客户端-服务器:系统A向系统B托管的URL发出HTTP请求,系统B返回响应。这与浏览器的运行方式相同。浏览器请求特定URL。请求被路由到Web服务器,Web服务器通常返回HTML页面。该页面可能包含对图像、样式表和JavaScript的引用,这会导致进一步的请求和响应。
  • 无状态:REST是无状态的:客户端请求应包含响应所需的所有信息。换句话说,应该可以按任意顺序发出两个或多个HTTP请求,并且会收到相同的响应(……除非API被设计为返回随机响应,如上面的测验示例)。
  • 可缓存:应将响应定义为可缓存或不可缓存。缓存提高了性能,因为没有必要为相同的URL重新生成响应。特定用户在特定时间的私有数据通常不会被缓存。
  • 分层:请求客户端无需知道它是在与实际服务器、代理还是任何其他中介进行通信。

创建RESTful Web服务

RESTful Web服务请求包含:

  1. 端点URL。实现RESTful API的应用程序将定义一个或多个URL端点,包括域名、端口、路径和/或查询字符串——例如,https://mydomain/user/123?format=json

  2. 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请求删除用户123
  3. HTTP标头。身份验证令牌或cookie等信息可以包含在HTTP请求标头中。

  4. 主体数据。数据通常以与HTML提交相同的方式通过HTTP主体传输,或者通过发送单个JSON编码的数据字符串来传输。

What Is a REST API?

REST API响应

响应有效负载可以是任何实用的内容:数据、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经常互换使用,因此任何一个都会根据需要创建或更新记录。

REST API“Hello World”示例

以下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}`);
);
登录后复制

客户端REST请求和CORS

考虑在浏览器中以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发出两个请求:

  1. 一个指向同一URL的HTTP OPTIONS请求,用于确定Access-Control-Allow-Origin HTTP响应标头是否有效
  2. 实际的REST调用

当您的服务器接收到OPTIONS请求方法时,它可以设置Access-Control-Allow-Origin HTTP响应标头,并返回一个虚拟的空响应,以确保不会重复工作。

REST API挑战

REST的成功很大程度上归功于其简单性。开发人员可以根据自己的喜好实现RESTful API,但这可能会导致进一步的挑战。有关实施策略的深入了解,请查看我们关于构建RESTful API的13个最佳实践。

端点一致性

考虑以下端点:

  • /user/123
  • /user/id/123
  • /user/?id=123

所有这些都是获取用户123数据的有效选项。当您进行更复杂的运算时,组合的数量会进一步增加。例如,返回十个姓氏以“A”开头并在companyX工作的用户,按出生日期倒序排列,从第51条记录开始。

最终,您如何格式化URL并不重要,但API的一致性非常重要。对于拥有许多开发人员的大型代码库来说,这可能是一项挑战。

REST API版本控制

API更改是不可避免的,但端点URL永远不应该失效,否则会破坏使用它们的应用程序。

API通常采用版本控制以避免兼容性问题。例如,/2.0/user/123取代/user/123。新的和旧的端点都可以保持活动状态。不幸的是,这随后需要维护多个历史API。旧版本最终可以被丢弃,但此过程需要仔细规划。

REST API身份验证

上面显示的测验API是开放的:任何系统都可以无需授权即可获取笑话。对于访问私有数据或允许更新和删除请求的API来说,这是不可行的。

与RESTful API位于同一域的客户端应用程序将发送和接收cookie,就像任何其他HTTP请求一样。(请注意,旧版浏览器中的Fetch()需要设置credentials初始化选项。)因此,可以验证API请求以确保用户已登录并拥有相应的权限。

第三方应用程序必须使用其他身份验证方法。常见身份验证选项包括:

  • HTTP基本身份验证。在请求标头中传递包含base64编码的用户名:密码字符串的HTTP Authorization标头。
  • API密钥。通过发出可能具有特定权限或仅限于特定域的密钥,授予第三方应用程序使用API的权限。密钥在HTTP标头或查询字符串中的每个请求中都传递。
  • OAuth。在发出任何请求之前,必须通过向OAuth服务器发送客户端ID和可能的客户端密钥来获取令牌。然后,OAuth令牌将与每个API请求一起发送,直到它过期。
  • JSON Web令牌(JWT)。数字签名的身份验证令牌安全地传输在请求和响应标头中。JWT允许服务器对访问权限进行编码,因此无需调用数据库或其他授权系统。

API身份验证将根据使用环境而有所不同:

  • 在某些情况下,第三方应用程序将被视为具有特定权限的任何其他已登录用户。例如,地图API可以向调用应用程序返回两点之间的路线。它必须确认应用程序是有效的客户端,但不需要检查用户凭据。
  • 在其他情况下,第三方应用程序正在请求属于单个用户的私有数据,例如电子邮件内容。REST API必须识别用户及其权限,但它可能并不关心哪个应用程序正在调用API。

REST API安全性

RESTful API提供了访问和操作应用程序的另一种途径。即使它不是一个备受关注的黑客目标,行为不良的客户端也可能每秒发送数千个请求并使您的服务器崩溃。

安全性不在本文讨论范围之内,但常见的最佳实践包括:

  • 使用HTTPS
  • 使用强大的身份验证方法
  • 使用CORS将客户端调用限制到特定域
  • 提供最少的功能——也就是说,不要创建不需要的DELETE选项
  • 验证所有端点URL和主体数据
  • 避免在客户端JavaScript中公开API令牌
  • 阻止来自未知域或IP地址的访问
  • 阻止意外的大型有效负载
  • 考虑速率限制——也就是说,使用相同API令牌或IP地址的请求每分钟限制为N个
  • 使用适当的HTTP状态代码和缓存标头进行响应
  • 记录请求并调查故障

多个请求和不必要的数据

RESTful API受其实现的限制。响应可能包含比您需要更多的数据,或者需要进一步的请求才能访问所有数据。

考虑一个提供对作者和书籍数据访问权限的RESTful API。要显示十大畅销书的数据,客户端可以:

  • 请求按销售数量(最畅销者优先)排序的前10个/book/详细信息。响应包含带有每个作者ID的书籍列表。
  • 发出最多10个/author/{id}请求以获取每个作者的详细信息。

这被称为N 1问题;对于父请求中的每个结果,必须发出N个API请求。

如果这是一个常见的用例,则可以更改RESTful API,以便每个返回的书籍都包含完整的作者详细信息,例如他们的姓名、年龄、国家/地区、传记等等。它甚至可以提供其其他书籍的完整详细信息——尽管这可能会大大增加响应有效负载!

为了避免不必要的大型响应,可以调整API,使作者详细信息可选——例如,?author_details=full。API作者需要处理的选项数量可能会令人眼花缭乱。

GraphQL能否解决REST API的问题?

REST难题导致Facebook创建了GraphQL——一种Web服务查询语言。可以将其视为Web服务的SQL:单个请求定义您需要的数据以及您希望如何返回数据。

GraphQL解决了一些由RESTful API带来的挑战,尽管它也引入了其他挑战。例如,缓存GraphQL响应变得很困难。

您的客户端不太可能遇到与Facebook类似的问题,因此在RESTful API超过其实际限制后,可能值得考虑GraphQL。

REST API链接和开发工具

所有语言中都有许多工具可以帮助进行RESTful API开发。值得注意的选项包括:

  • Swagger:各种工具,有助于设计、记录、模拟、测试和监控REST API
  • Postman:RESTful API测试应用程序
  • Hoppscotch:Postman的开源、基于Web的替代方案

还有许多公共REST API,可用于笑话、货币转换、地理编码、政府数据以及您可以想到的每个主题。许多是免费的,尽管有些需要您注册API密钥或使用其他身份验证方法。分类列表包括:

  • Any API
  • API list
  • Public APIs
  • Google APIs Explorer

在实现您自己的Web服务之前,请尝试在您自己的项目中使用一些RESTful API。或者,可以效仿Facebook、GitHub、Google和许多其他巨头,构建您自己的RESTful API。

关于REST API的常见问题

什么是REST API?

REST API(具象状态传输应用程序编程接口)是一套规则和约定,允许软件应用程序使用REST架构风格的原则通过互联网相互通信和交互。

REST API的主要特征是什么?REST API的特点是使用资源、无状态的客户端-服务器通信、标准HTTP方法(GET、POST、PUT、DELETE)和统一接口,这些接口通常涉及使用URL访问和操作资源。

为什么称之为REST API?

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的“四个支柱”。这些组件有助于定义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中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板