我有java Restful 服务,其功能按计划运行。我想实现一种按需运行该功能的方法。实现这一目标的正确/最有效的方法是什么?
由于 REST 基本上只是我们人类如何使用 Web 的概括,因此您可以简单地设计交互,就像人类自然地与您的服务交互一样。 IE。您可以有一个“页面”(=资源),其中列出了所有已注册的任务,即包含该任务正在执行的操作的简短人类可读描述、计划的时间段以及用于编辑或删除相应任务的链接。在内部,对于列出的每个任务,都会创建一个按指定时间间隔执行的 cronjob 等,或者如果配置为在该特定时间的一次性任务,然后从计划任务中删除。
该列表还将提供用于创建新任务、编辑或删除现有任务的链接。编辑自然会以特定表单呈现手头任务的属性,填写该表单中的所有指定字段,因此允许客户端更改其中的内容,然后简单地将数据发送回服务器。单击删除链接可能会询问您是否确实要删除该任务。这基本上就是 HATEOAS。您使用给定的控制元素(如链接、表单及其各种字段和按钮)来驱动您的工作流程。
您可以发送 HTML 作为响应,也可以将资源的数据映射到其他格式,即类似于流行的基于 JSON 的有效负载。然而,该有效负载应该遵循能够向客户端表达链接和表单以及所有这些爵士乐的文档类型,普通 JSON 无法做到这一点。 application/hal+json (HAL)添加了对链接和嵌入内容的支持,application/prs.hal-forms+json (HAL-Forms)通过添加表单支持扩展了HAL,application/ion+json或 application/ion+json;v=2 (Ion) (顺便说一句,不要将其与 Amazon 的 Ion ^^ 混淆)是一种不同的基于 JSON 的语法,但也支持表单。实际上有一些这样的东西。其中一些媒体类型甚至支持配置文件,可以添加一些额外的“含义”,例如在
中application/vnd.collection+json;profile=http://example.org/profiles/order http://schema.org/Order
服务器声明它返回客户端应将其解释为列表或集合的表示,其中包含表达订单并遵循某些通用或专有订单定义的条目。无法处理配置文件的客户端基本上必须忽略它们,而那些能够处理附加信息的客户端可能能够应用更合适的映射而不是通用映射。
您希望通过 REST 实现的目标是获得按照您认为合适的方式开发服务器端的自由,并且不必担心破坏客户端,遗憾的是,当客户端耦合到服务器时,这种情况经常发生。客户端和服务器都使用媒体类型作为交换消息的契约,而不是客户端耦合到特定的 API。然而,与传统的 RPC 系统相比,您不限于一种消息格式和语法,而是可以支持各种不同的消息格式和语法,即上面提到的 HAL、HAL-Forms 和 Ion。因此,这只是内容类型协商服务器应为客户端生成哪种类型的响应的问题。
对媒体类型的强烈关注保证了服务器必须用媒体类型的功能来表达资源的状态。它应该生成一些规范中未定义的标记或语法,因为接收者可能不知道如何处理该数据。互操作性是 REST 的主要关注点之一。
当然,这需要做更多的工作才能让东西发挥作用。 IE。您可能需要从通用表示格式到内部模型的映射。通过灵活的映射,您的客户端应该能够与大量其他服务进行交互,而无需进行重大更改,就像人类服务于 Web 的情况一样。我什至看到有人尝试使用生成式人工智能来帮助进行这些映射