REST API 与 Web API

2024-04-17

我是构建 HTTP API 的初学者,我似乎对 REST API 和 Web API 之间的区别感到困惑。我在网上读到更多相关内容,困惑似乎越来越多。我猜菲尔丁有与此链接相同的问题http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven

我在工作中构建了一个 HTTP API,以为我构建了一个 REST API,就像我在任何地方读到的那样,他们正在构建 Web/HTTP API 并将其称为 REST。

当我发现一个遵循 HATEOAS 原则的 API 是 Github REST API 时https://api.github.com https://api.github.com。我尝试使用它作为我在 Github 上的用户名(GEThttps://api.github.com/users/vvs14 https://api.github.com/users/vvs14),它根据 HATEOAS 原则返回所有相关链接。

恕我直言,它是现实世界中最好的 API 之一,接近 REST 规范。尽管我无法理解哪个 URI 支持对其进行哪些操作,以及如何在任何 REST API 的情况下找到它(如果我是 REST API 的使用者),或者如果我托管 API,如何告诉使用者?

一个很好的博客是https://www.e4developer.com/2018/02/16/hateoas-simple-explanation/ https://www.e4developer.com/2018/02/16/hateoas-simple-explanation/.

大多数博客中给出的所有其他示例只是告诉您使用 JSON 作为 REST API,将所有内容作为资源作为 REST API,并使用 HTTP 动词进行 CRUD 操作作为 REST API。我发现这些都不是真的。

在我的工作中,我使用 Sendgrid 的 Web API 向客户发送电子邮件,他们称之为 Web API,而不是 REST,我认为这是非常正确的。

谁能举例说明这两者之间的区别?

如果Github API是REST API的正确示例,那么我们如何知道哪个URI支持哪些操作,因为这里没有提到媒体类型?


你是对的,有很多混乱。专家通常将“真正的”REST API 称为 HATEOAS 或超媒体驱动的 API,以避免这种混淆。大多数 API 都是这样的do自称 REST api 的通常不是。

因此,当与其他工程师讨论 REST api 时,首先澄清每个人认为的 REST 和非 REST 是有帮助的。他们并不是不知道的坏工程师,“REST”这个术语有自己的生命,我想说 HATEOAS 可能更多的是一种小众技能。

我同意尼古拉斯·尚克(Nicholas Shank)的回答,在许多情况下,普遍要做的事情是弄清楚是否例如DELETE有效,就是实际发出DELETE看看之后是否有效。

但这并不总是有帮助,因为许多构建 API 的人希望不显示“删除”按钮(如果它无论如何也不起作用)。

那么什么是合理的方式告诉客户DELETE有空吗? HTTP 标准实际上确实有一个Allow您可以使用该标头来了解哪些方法适用于给定端点。要了解这些是什么,您可以发出OPTIONS要求。并非每个框架都支持开箱即用,但这是一种合法的方法。

提前告诉客户的另一种方法是将此信息嵌入到您正在访问的资源中。举几个例子:

  1. 链接提示 https://datatracker.ietf.org/doc/html/draft-nottingham-link-hint-01是一个互联网标准草案,可以在各种不同的地方提供这些提示,例如 HAL、HTTP 链接标头或其他。它基本上建议了该信息的通用格式。
  2. 如果您使用 OpenAPI 之类的东西,您可以在 API 规范中添加哪些方法可以工作,哪些方法不能工作。这对于您知道的情况非常有效DELETE永远不会起作用,但在不同用户可能具有不同级别的访问权限并且有些人可以使用的情况下,它不会真正帮助您DELETE而其他人则不能。
  3. 您可以将此信息嵌入到您自己的格式中,将其表示为一组权限,可能采用 JSON 格式,您的应用程序可以理解该格式来解释是否可以执行某些操作。
  4. 某些 HATEAOS 格式明确嵌入了有关可以通过操作采取何种操作的信息。一个很好的例子是SIREN https://github.com/kevinswiber/siren格式。 HAL 本身没有这个。

最终,良好的 HATEAOS 格式不仅会返回有关资源和与其他人的关系的信息,还会给出一组可以采取的潜在操作。大多数 REST APIareHATEOAS 往往不这样做,但 HTML 是这样做的最好例子。如果没有执行操作的链接、按钮或表单,用户就无法发现该操作。

嵌入 HAL 中的链接提示示例

{
  "_links": {
    "self": {
      "href": "/orders/523",
      "hints": {
        "allow": ["GET", "DELETE"],
      }
    }
  }
}

警报器示例

 {
  "class": [ "order" ],
  "properties": { 
      "orderNumber": 523, 
  },
  "actions": [
    {
      "name": "delete-order",
      "title": "Delete Order",
      "method": "DELETE",
      "href": "/orders/523",
    }
  ],
  "links": [
    { "rel": [ "self" ], "href": "/orders/523" },
  ]
}

选项响应

HTTP/1.1 200 OK
Allow: GET, DELETE
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

REST API 与 Web API 的相关文章

随机推荐

  • 读取、表示和渲染地图数据的最佳方式是什么?

    我有兴趣编写一个简单的导航应用程序作为我的宠物项目 在搜索了免费地图数据后 我决定了美国人口普查局 TIGER http www census gov geo www tiger tgrshp2007 tgrshp2007 html2007
  • Android 6 (23) - 无需许可

    我坚持使用 Android 6 中的新权限模型 我在清单中定义了以下权限
  • 计算函数合理性的算法/蒙特卡罗方法

    我正在编写一个程序 尝试复制本文开头讨论的算法 http www stat stanford edu cgates PERSI papers MCMCRev pdf http www stat stanford edu cgates PER
  • 我将如何使用括号表示法中的单个变量来访问深度值?

    我想知道如何执行以下操作 我有以下数据 dta fielddata text1 4B030C2E 3D53 4DF8 A3535EF377B45DE5 text2 Unlabeled 我可以使用括号符号访问它 如下所示 var result
  • Google 表格中的正则表达式“NOT”(RE2)

    我想检查单元格中是否有一个单词而不是另一个单词 在这个帖子 https stackoverflow com questions 28775466 google sheet regexreplace match everything exce
  • 删除与某个模式匹配的多个文件

    我使用 Python 和 Django 制作了一个在线画廊 我刚刚开始添加编辑功能 从旋转开始 我使用 sorl thumbnail 按需自动生成缩略图 当我编辑原始文件时 我需要清理所有缩略图 以便生成新的缩略图 每张图片有三到四个 我针
  • Swift async/await 取代了 DispatchQueue.main.async

    在新的 Swift 5 5 中使用 async await 并发机制时如何返回主线程 我应该只用 MainActor 标记函数 类吗 我还能用吗DispatchQueue main async 会是正确的吗 因为新机制不使用 GCD 并且异
  • HABTM 与强参数的关联不会在 Rails 4 中保存用户

    用户模型 has and belongs to many events 事件模型 has and belongs to many users 用户控制器 params require user permit role event ids g
  • geoIP 从 ASP.NET 查找国家/地区

    我可以从 ASP NET 页面检索客户端的 IP 地址 至少是表面上的 IP 地址 我想知道是否有可以从代码隐藏访问的免费服务 当使用 IP 查询时 该服务将返回国家 地区 不需要城市 我无法使用基于 Web http 的服务 您必须手动输
  • 如何消除SQL中的NULL字段

    我正在为 SQL Server 2008 R2 开发 TSQL 查询 我正在尝试开发此查询来识别一条记录 客户 由于其中一些值为 NULL 因此我目前正在对大多数表执行 LEFT JOINS 但 LEFT JOIN 的问题是 现在我为某些客
  • Nestjs Apollo graphql上传标量

    我正在使用 Nestjs graphql 框架 我想使用 apollo 标量上传 我已经能够在另一个不包含 Nestjs 的项目中使用标量 schema graphql App module ts注册graphql GraphQLModul
  • 如何查询Firebase Firestore参考数据类型?

    我正在使用 Firestore参考 https firebase google com docs firestore manage data data types用于存储对用户的引用的数据类型 如下面的屏幕截图所示 用户参考 用户收藏 当我
  • Angular 4 + Electron - 如何运行应用程序并观察更改(实时重新加载)

    我正在使用 Angular 4 创建一个 Electron 应用程序 我如何设置它 以便它监视任何更改并实时重新加载它 包 json name angular electron version 0 0 0 license MIT main
  • 如何将网络音频流保存到文件(c++/java)

    是否有任何库或众所周知的方法来保存音频网络流 网络广播 mp3 流 以编程方式归档 您可以使用 libvlcVLC http www videolan org vlc 项目 这wiki http wiki videolan org Libv
  • 策略模式和访客模式有什么区别?

    我很难理解这两种设计模式 您能否给我上下文信息或示例 以便我可以得到清晰的想法并能够映射两者之间的差异 Thanks The 策略模式就像一个1 many关系 当存在一种类型的对象并且我想对其应用多个操作时 我使用策略模式 例如 如果我有一
  • mojoPortal 还是 Umbraco?

    我已经寻找免费 开源 ASP NET CMS 门户系统有一段时间了 并将其分为两个不同的系统 乌姆布拉科 http umbraco org http umbraco org 魔力门户 http www mojoportal com http
  • 如何让 ASP.NET DataPager 控件在 UpdatePanel 中工作?

    我有一个顶部有参数的搜索页面 底部有一个带有结果的搜索按钮 整个内容都包含在母版页内的更新面板中 单击搜索按钮后 它会显示第一页 但是 如果您单击 DataPager 上的下一个按钮 它不会显示第二页 它显示第二页没有结果 任何帮助将不胜感
  • C++ 和 Java 中异常处理的区别?

    在Java中 如果特定的代码行导致程序崩溃 那么异常就会被捕获并且程序会继续执行 但是 在 C 中 如果我有一段代码导致程序崩溃 例如 try int x 6 int p NULL p reinterpret cast
  • 如何测试子组件是否已渲染?

    在酶中 您可以检查子组件是否存在 如下所示 expect wrapper find ChildComponent toHaveLength 1 React 测试库中的这个测试相当于什么 我找到的所有在线示例都只涵盖了寻找 dom 元素的非常
  • REST API 与 Web API

    我是构建 HTTP API 的初学者 我似乎对 REST API 和 Web API 之间的区别感到困惑 我在网上读到更多相关内容 困惑似乎越来越多 我猜菲尔丁有与此链接相同的问题http roy gbiv com untangled 20