为 RESTful(超媒体)API 编写客户端

2023-11-23

这几天我一直在阅读“真正的”RESTful API,并且我think我快要明白它的意思了。

但我偶然发现的一件事是,我什至无法想象如何为“真正的”超媒体 API 编写客户端:

  1. 我读过的大多数例子都谈论浏览器和蜘蛛,但这并不是特别有帮助:一个是人类指导的“智能”,另一个是愚蠢的“随机”。就目前情况而言,我的印象是,你需要学习人工智能才能让客户工作。

  2. 我不清楚的一件事是客户如何知道在任何给定链接上使用哪个动词?这是否隐含在 uri 的“rel”类型中?另一种选择(阅读here)似乎正在使用 xhtml 并拥有一个可以解析和发布表单的客户端。

  3. 链接发生变化但到达该链接的路由不变的可能性有多大? 在您看到的大多数示例中,路线和链接是相同的:

例如。如果我想设置一个客户端,它将带回托尼蛋糕店的蛋糕列表:

http://tonis.com
{ link: { type : "cakes" ; uri : "http://tonis.com/cakes" } }

当 Toni's 变为 Toni's Food Shop 并且链接变为http://tonis.com/desserts/cakes?

我们保留最初的cakes链接在根目录,以实现反向兼容性?如果没有,我们如何为可怜的小代理做一个“重定向”,他被告知“去根目录,寻找蛋糕”?

我缺少什么?


好吧,我也不是 REST 专家,我最近读了很多相关的东西,所以我要写的不是我的经验或观点,而是我所读内容的总结,尤其是休息实践 book.

首先,你无法逃避客户端和服务器之间的一些初始协议,REST 的目标是让他们就与他们双方相关的最少事情达成一致,并让每一方关心自己的事情他们自己。例如,客户端不应该关心链接布局或数据如何存储在服务器上,并且服务器不应该关心客户端的状态。他们事先(即在交互开始之前)达成一致的是上述书籍的作者所说的“域应用协议”(DAP)。

DAP 的重要之处在于它是有状态的,尽管 HTTP 本身不是有状态的(因为任何客户端服务交互都有状态,至少有开始和结束)。这种状态可以用“客户端下一步可以/可能/预计做什么”来描述:“我已经开始使用该服务,现在怎么办?好的,我可以搜索项目。搜索此项目,下一步是什么?好的,我可以订购这个那个……等等”

超媒体内容类型的定义是能够处理数据交换和交互状态。正如我已经提到的,状态是根据可能的操作来描述的,并且来自 REST 中的“资源”,所有操作都是根据可访问的资源来描述的。我想,您已经看到了缩写“HATEOAS(超媒体作为应用程序状态引擎),这就是它的明显含义。

因此,为了与服务交互,客户端使用他们都理解的超媒体格式,该格式可以是标准的、自行开发的或这些格式的混合(例如基于 XML/XHTML 的)。除此之外,它们还必须共享协议,很可能是 HTTP,但由于标准中省略了一些细节,因此必须有一些其用法的习惯用法,例如“使用 POST 创建资源并使用 PUT 更新” 。此外,此类协议将包括服务的入口点(同样,就可访问资源而言)。

这三个方面充分定义了域协议。特别是,客户端在开始使用服务之前不应该知道任何内部链接,也不应该在交互完成后记住它们。因此,内部导航的任何更改(例如重命名)/cakes to /f5d96b5c只要顾客遵守最初的协议并从前门进入商店,就不会受到影响。

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

为 RESTful(超媒体)API 编写客户端 的相关文章

  • 如何保护 RESTful Web 服务的安全?

    我必须实施安全RESTful Web 服务 https www ibm com developerworks webservices library ws restful 我已经使用谷歌做了一些研究 但我陷入困境 Options TLS H
  • 使用 authlogic_api 进行 Rails REST API 访问

    我正在为 Steam 游戏编写 Rails 后端 API 该游戏只能通过 REST 调用访问 因此不需要特定于用户的身份验证 我正在努力实施authlogic api 插件 http github com phurni authlogic
  • .Net Web API 抛出异常/返回响应/返回 404/400 响应的错误响应?

    我正在使用 net web api 开发一些宁静的 Web 服务 对于某些情况 我需要向客户端返回 404 NotFoundStatus 或 400 BadRequest 看起来框架中有很多方法可以做到这一点 下面列出一些我所知道的方法 是
  • 对多个路径使用 Single Jersey REST 类

    我已经开始使用 JAX RS 开发 REST 服务 使用 Jersey 非常简单 但是我在使用 Spring MVC 和 Jersey REST 类时遇到的一个区别是 Spring 支持忽略根路径元素并在方法级别具有单独的路径映射 因此 如
  • 如何在 Delphi REST 中发布内容类型为“multipart/form-data”的数据?

    我正在尝试使用 REST API 发送请求multipart form data作为内容类型 我总是收到 HTTP 1 1 500 Internal Error 作为响应 我尝试向需要的方法发送请求application x www for
  • 从 QueryDSL 谓词对象中获取参数

    我使用带有 Spring REST 端点的 QueryDSL 谓词对象来检索和查询参数值 GetMapping subjectId students RolesAllowed Roles PLATFORM ADMIN Roles USER
  • 使用 Spring RestTemplate 时忽略 SSL 证书验证

    我正在使用 Spring RestTemplate 发出 HTTPS 请求 并且我想忽略 SSL 证书 这是我创建restTemplate请求的代码 TrustStrategy acceptingTrustStrategy X509Cert
  • 如何向最终用户隐藏 REST API Url?

    是否可以隐藏我通过 AJAX 用于填充页面数据的 REST URL 我不希望其他人从我的 REST API 获取和使用 但需要使用它在我的网站中显示内容 如何向最终用户隐藏我的 REST API URL 无法在 JavaScript 中向最
  • 如何进行 REST 式更新?

    如果我有一个对象 请说Employee 我想提供两种不同的更新方式 更新绩效评级或更新联系信息 构建 API 的 REST 式方式是什么 我认为正确的方法是 POST 我担心的是 对于用户来说 首先获取对象的两个部分 绩效评级和联系信息 仅
  • 如何使用 Azure DevOps 的 python 客户端 API 将用户添加到 Azure DevOps?

    我正在编写一个 python 脚本来将用户 来自 AAD 支持的提供商的现有用户 添加到 Azure DevOps 我正在使用 Azure DevOps 的 python 客户端库来实现此目的 身份验证后 我可以从 azure devops
  • 如何在不同的端口上运行@RestController?

    我在用着spring rest创造一些 RestController小服务程序 该应用程序不是在网络服务器上运行 而是作为带有嵌入式 tomcat 的简单命令行工具运行 它们中的大多数应该在公共端口上运行 该端口是使用指定的server p
  • 来自复杂对象的 spring RestTemplate POST 参数

    我正在尝试使用 postForObject 方法使用restTemplate 来测试我们的REST 服务 单元测试 Test public void testPostOrder String url BASE URL orders Orde
  • 外部依赖错误的 HTTP 状态代码

    当服务器与外部 API 通信出现问题时 返回的正确 HTTP 状态代码是什么 假设客户端向我的服务器 A 发送有效请求 然后 A 查询服务器 B 的 API 以便执行某些操作 然而 B 的 API 当前抛出 500 错误或因某种原因无法访问
  • 当前用于验证 Http 请求(REST、Xml over Http)的标准是什么?

    该标准应解决以下身份验证挑战 例如 重放攻击 中间的人 明文攻击 字典攻击 暴力攻击 被假冒服务器欺骗 我已经研究过 Amazon Web Services 这是一种可能性 更重要的是 似乎有两种最常见的方法 使用 apiKey 它的编码方
  • Jersey 和 Spring 中的全局异常处理?

    我正在使用 Jersey 和 Spring 3 2 以及 Open CMIS 开发 RESTful Web 服务 我没有使用 Spring 的 MVC 模式 它只是 Spring IOC 和 Jersey SpringServlet 控制器
  • 在 RESTful Web 服务中实现注销

    我正在开发一个需要注销服务的移动应用程序 登录服务是通过数据库验证来完成的 现在我陷入了注销状态 退一步 您没有提供有关如何在应用程序中执行身份验证的详细信息 并且很难猜测您在做什么 但是 需要注意的是 在 REST 应用程序中 不能有会话
  • 获取/发布到 RESTful Web 服务

    我需要从 VB6 对 RESTful Web 服务进行一些 GET 和 POST 操作 最好和最简单的方法是什么 您需要添加对 MSXML 库的引用 Dim sUrl As String Dim response As String Dim
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • 保护 REST 和 JSON

    我想利用 RESTful 架构构建提供 JSON 数据的 Web 服务 但我只想要我自己的客户端应用程序可以从我的网络服务请求 基本上 我的 Web 服务包含不供公众使用的敏感数据 但我想以这种方式构建它 以便我可以构建连接到我的 Web
  • 该Web容器尚未启动@Glassfish 4.0.01 web

    所以 这就是我对我的服务进行 REST 调用后得到的结果 2014 04 25T01 06 52 393 0200 glassfish 4 0 WARNING javax enterprise web tid ThreadID 21 Thr

随机推荐

  • Spring boot - 预检响应没有 HTTP 正常状态

    我正在使用 Angular 5 制作网络 每次尝试执行此操作时都会收到此错误GET要求 我在这里阅读了大量的答案 但没有一个对我有用 正如我所读到的 这是因为我正在向此请求添加自定义标头 这是需要完成的 因为我正在使用 Spring Sec
  • xcode 6 beta 4 - MessageComposeResult 无法转换为OptionalNilComparisonType

    我刚刚从 Xcode 6 Beta 3 升级到 Beta 4 在 3 中我的应用程序编译完美 但在 4 中出现以下错误 任何人都可以解释并提供解决方案吗 func messageComposeViewController sendMsg M
  • 如何从 Pandas 数据框列中的日期时间减去 3 小时?

    我有两列日期时间为格林尼治标准时间 我需要从此日期时间减去三个小时 例如 在第 4 行中 我需要在 3 小时内减去 startdate 结果是 08 02 2018 17 20 0 在同一行 4 中 我需要减去 3 小时内的结束日期 结果是
  • C++ 从函数返回指向数组的指针的正确方法

    我对 C 相当陌生 并且一直在避免使用指针 根据我在网上阅读的内容 我无法返回数组 但我可以返回指向它的指针 我编写了一个小代码来测试它 并想知道这是否是正常 正确的方法 include
  • pg nodejs 包导致“json 类型的输入语法无效”

    我的项目有以下设置 使用pg节点 postgres 包 简单的表 tmp 如下所示 根据jsonORG和Postgres 文档物体 foo true 在语法上是有效的 JSON 并且当使用 pgAdmin 查询工具时 UPDATE tmp
  • Android onFling 没有响应

    我首先是 Android 新手 所以首先考虑一下新手犯的错误 我正在尝试在我的代码中添加一个 fling 函数 public class MainGamePanel extends SurfaceView implements Surfac
  • 在自定义组件中找不到 Designintf.dcu

    我在这里将一些自定义的delphi组件转换为最新的delphi xe5 我已经在 delphi xe5 ide 中构建了它 并将 desgninf 替换为 designintf 和设计编辑器 我还在参考中包含了 designide dcp
  • 石墨中的自定义查询

    我们需要收集多个服务器和业务流程上的时间序列信息 并考虑使用石墨 如果我们想显示原始数据似乎很好 但是 如果我们想对这些数据进行 BI 并运行自定义查询怎么办 石墨是否允许这样做 或者我可以指示石墨在 postgress 上存储数据吗 Gr
  • 如何访问 JavaScript 正则表达式中的匹配组?

    我想使用 a 来匹配字符串的一部分正则表达式然后访问带括号的子字符串 var myString something format abc I want abc var arr s format s exec myString console
  • 如何使用 BitmapFactory.decode*() 指定位图格式(例如 RGBA_8888)?

    我正在打几个电话BitmapFactory decodeFile and BitmapFactory decodeResource 我想指定位图解码的格式 例如 RGB 565 或 RGBA 8888 目前 解码的位图格式似乎取决于传入的图
  • 返回基于布尔值的数字序列的更优雅的方法?

    这是我作为 data frame 一部分的布尔值示例 atest lt c FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE
  • Node.js 是否具有相当于浏览器中的 window 对象

    我的意思是node js 是否有全局函数方法的对象 在浏览器中是这样的 function myGlobalFunction console log this window myGlobalFunction gt true 节点中最接近的等价
  • Azure 服务总线 ReceiveBatch() 的奇怪行为

    当前使用 Azure 服务总线主题并在使用 ReceiveBatch 方法接收消息时遇到问题 问题是预期的结果实际上并不是我得到的结果 这是基本代码设置 用例如下 SubscriptionClient client Subscription
  • jquery stopPropagation问题与live方法

    Jquery stopPropagation 方法不适用于 live 方法 下面的代码可以正常使用单击而不是实时方法 非常感谢任何帮助 Code
  • 将自定义帖子类型/帖子添加到 Woocommerce

    我有一个个人主题 A 我希望它也可以在没有 Woocommerce 的情况下工作 什么时候Woocommerce WC 添加插件我会将A产品与WC集成 我有一个名为 对象 的自定义帖子类型 如何才能通过 WC 购买 对象 我已经在 Stac
  • 如何通过我的 Discord 机器人使用 /python 发送嵌入内容?

    我一直在开发一个新的 Discord 机器人 我已经学到了一些东西 现在 我想让这些东西变得更加定制 我一直在尝试让机器人发送嵌入的公共消息 embed discord Embed title Tile description Desc c
  • 配置 WCF 服务 (Web.config) - HttpsGetEnabled、HttpsGetUrl

    我正在尝试将带有 WCF 服务的 Silverlight 部署到托管 基本上 我和这个人有同样的问题 如何配置 WCF 服务通过 HTTPS 工作而无需 HTTP 绑定 除了解决方案对我不起作用 edit 我一直粘贴错了 但还是不行 我已经
  • Python 控制台和 Ping 的文本输出,包括 \n\r [重复]

    这个问题在这里已经有答案了 我不知道发生了什么 但是当我打印到控制台或文本文件时 换行符 n 不起作用 而是显示在字符串中 知道如何在控制台和文本文件中避免这种情况吗 My code import subprocess hosts file
  • 如何使用 JavaScript 禁用 li 标签

    我在我的页面上使用以下 HTML ul li class tab1 a href tab1 htm Tab a a li li class tab2 a href tab2 htm Tab b a li li class tab3 a hr
  • 为 RESTful(超媒体)API 编写客户端

    这几天我一直在阅读 真正的 RESTful API 并且我think我快要明白它的意思了 但我偶然发现的一件事是 我什至无法想象如何为 真正的 超媒体 API 编写客户端 我读过的大多数例子都谈论浏览器和蜘蛛 但这并不是特别有帮助 一个是人