目录
关键要点
REST API示例
REST API与其他技术
创建RESTful Web服务
REST API响应
REST API“Hello World”示例
客户端REST请求和CORS
REST API挑战
端点一致性
REST API版本控制
REST API身份验证
REST API安全性
多个请求和不必要的数据
GraphQL能否解决REST API的问题?
REST API链接和开发工具
关于REST API的常见问题
什么是REST API?
为什么称之为REST API?
REST API的四个组成部分是什么?
首页 web前端 js教程 什么是REST API?

什么是REST API?

Feb 09, 2025 pm 12:37 PM

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

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

前端热敏纸小票打印遇到乱码问题怎么办? 前端热敏纸小票打印遇到乱码问题怎么办? Apr 04, 2025 pm 02:42 PM

前端热敏纸小票打印的常见问题与解决方案在前端开发中,小票打印是一个常见的需求。然而,很多开发者在实...

神秘的JavaScript:它的作用以及为什么重要 神秘的JavaScript:它的作用以及为什么重要 Apr 09, 2025 am 12:07 AM

JavaScript是现代Web开发的基石,它的主要功能包括事件驱动编程、动态内容生成和异步编程。1)事件驱动编程允许网页根据用户操作动态变化。2)动态内容生成使得页面内容可以根据条件调整。3)异步编程确保用户界面不被阻塞。JavaScript广泛应用于网页交互、单页面应用和服务器端开发,极大地提升了用户体验和跨平台开发的灵活性。

谁得到更多的Python或JavaScript? 谁得到更多的Python或JavaScript? Apr 04, 2025 am 12:09 AM

Python和JavaScript开发者的薪资没有绝对的高低,具体取决于技能和行业需求。1.Python在数据科学和机器学习领域可能薪资更高。2.JavaScript在前端和全栈开发中需求大,薪资也可观。3.影响因素包括经验、地理位置、公司规模和特定技能。

如何使用JavaScript将具有相同ID的数组元素合并到一个对象中? 如何使用JavaScript将具有相同ID的数组元素合并到一个对象中? Apr 04, 2025 pm 05:09 PM

如何在JavaScript中将具有相同ID的数组元素合并到一个对象中?在处理数据时,我们常常会遇到需要将具有相同ID�...

JavaScript难以学习吗? JavaScript难以学习吗? Apr 03, 2025 am 12:20 AM

学习JavaScript不难,但有挑战。1)理解基础概念如变量、数据类型、函数等。2)掌握异步编程,通过事件循环实现。3)使用DOM操作和Promise处理异步请求。4)避免常见错误,使用调试技巧。5)优化性能,遵循最佳实践。

如何实现视差滚动和元素动画效果,像资生堂官网那样?
或者:
怎样才能像资生堂官网一样,实现页面滚动伴随的动画效果? 如何实现视差滚动和元素动画效果,像资生堂官网那样? 或者: 怎样才能像资生堂官网一样,实现页面滚动伴随的动画效果? Apr 04, 2025 pm 05:36 PM

实现视差滚动和元素动画效果的探讨本文将探讨如何实现类似资生堂官网(https://www.shiseido.co.jp/sb/wonderland/)中�...

JavaScript的演变:当前的趋势和未来前景 JavaScript的演变:当前的趋势和未来前景 Apr 10, 2025 am 09:33 AM

JavaScript的最新趋势包括TypeScript的崛起、现代框架和库的流行以及WebAssembly的应用。未来前景涵盖更强大的类型系统、服务器端JavaScript的发展、人工智能和机器学习的扩展以及物联网和边缘计算的潜力。

console.log输出结果差异:两次调用为何不同? console.log输出结果差异:两次调用为何不同? Apr 04, 2025 pm 05:12 PM

深入探讨console.log输出差异的根源本文将分析一段代码中console.log函数输出结果的差异,并解释其背后的原因。�...

See all articles