消息监控系统的restapi-URI设计

消息监控系统的restapi-URI设计,rest,api-design,Rest,Api Design,我正在研究处理信息的监控系统。消息处理管道如下所示: 新建->正在处理->已处理->已删除(历史记录) 系统必须能够: 通过唯一标识符请求所有消息和消息 修改它们(我是指标记为已处理、标记为已删除等) 使用消息字段筛选器进行搜索(例如,按消息搜索 (业主) 我无法设计包含名词的RESTful URI,也无法设计用于此目的的动词。我很难在这个系统中找到正确的资源 最简单的方法是像这样使用URI host/messages/new host/messages/processing host/me

我正在研究处理信息的监控系统。消息处理管道如下所示: 新建->正在处理->已处理->已删除(历史记录)

系统必须能够:

  • 通过唯一标识符请求所有消息和消息
  • 修改它们(我是指标记为已处理、标记为已删除等)
  • 使用消息字段筛选器进行搜索(例如,按消息搜索 (业主)
我无法设计包含名词的RESTful URI,也无法设计用于此目的的动词。我很难在这个系统中找到正确的资源

最简单的方法是像这样使用URI

host/messages/new
host/messages/processing
host/messages/processed
host/messages/removed
但这不是休息,因为 -这仍然是相同的消息,但字段值不同,它们不是新的实体 -我使用动词来标识状态,而不是资源

所以问题是如何在这里应用REST设计? 我很难想象处理对象状态监控的系统的REST设计


非常感谢您在这个主题上的想法和建议。

首先,RESTful系统不应该在URI的设计上花费太多精力,相反,它们应该专注于媒体类型的创建,并使用URI的关系名称,让客户能够在媒体类型中查找其含义。客户端本身不验证或解释URI,因此并不真正关心URI的外观,它只会根据媒体类型中概述的语义基于关系名称调用URI

这具有将资源绑定到关系名称而不是具体URI的优点。如果服务器更改了资源的位置,则无论URI指向哪个位置,使用关系名称而不是URI本身的客户端仍然能够处理请求

对于您的具体示例,您有一个消息资源和属于该资源的一些状态。如何设计这种关系取决于你自己。如果希望消息的实际有效负载保持不变,则可以将状态信息放在标题中(基本上是返回文档的元数据),或者在相应消息的子资源中定义它们。您还可以使用(或定义自己的)支持嵌入资源的媒体类型,类似于允许嵌入属于某个资源的附加数据的媒体类型

包含当前状态的消息的类HAL表示可能类似于下面的示例。但是,请注意,此表示形式既不基于实际的媒体类型,也不完整。它应该只是将您可以在方法中使用的概念形象化

{
“_链接”:{
“自我”:{
“href”:“/api/messages/1234”,
“标题”:“获取此邮件的最新版本”
},
“国家”:{
“href”:“/api/messages/1234/states”,
“标题”:“列表说明邮件已按时间顺序排列”
},
“查找”:{
“href”:“/api/消息{?id、发送者、接收者、状态}”,
“模板化”:正确,
“标题”:“查找邮件”
},
“标记已处理”:{
“href”:“/api/messages/1234/states”,
“标题”:“将邮件标记为已处理”,
“类型”:“应用程序/vnd.您的组件消息状态更新+hal+json”
},
...
},
“发件人”:“用户1”,
“接收者”:“用户2”,
...
“_嵌入式”:{
“当前状态”:{
“_链接”:{
“自我”:{
“href”:“/api/messages/1234/states/new”
}
}
“类型”:“新建”,
“时间戳”:“2017-10-21'T'22:25:00Z”,
...
}
}
}
在HTML中,发送到服务器的数据通常以公式(
)形式输入。HAL没有明确定义这样的构造。在扩展媒体类型时,现在可以在媒体类型中定义HTML表单的对应项,或者定义客户机应如何处理某些关系名称的规则集

在这个简单的示例中,客户机必须根据交换数据的媒体类型来推断如何处理特定的链接关系,如
markAsProcessed
。它可以定义调用
markAsProcessed
链接关系的请求应向服务器发送包含给定消息的最新状态信息的
PUT
请求。在这种情况下,明确列出了向服务器发出的请求应采用与媒体类型
application/vnd兼容的表示形式。您的comp.message state update+hal+json
,它定义了服务器预期的有效负载的实际语法和语义

提供可在链接关系名称内使用的两个其他字段。如果这不足以满足您的需要,您必须通过为链接添加新字段来扩展媒体类型,即指定应使用
PUT
PATCH
POST
。这也必须在新的或扩展的媒体类型中定义,并可能由提供给其他客户,以便允许其他供应商在其框架中实现此媒体类型,从而允许其他客户也使用此媒体类型

然而,在创建新的媒体类型之前,您应该知道是否已经有类似的东西可用,您可以使用或进一步扩展


请注意,他的建议只是一个建议。因为REST不是一种协议,而只是一种体系结构风格,如果正确遵循这种风格,分布式系统中的客户端就可以与服务器API解耦。如果您为您的Web API维护自己的客户机,您当然可以遵循自己的方法,尽管您可能应该将您的服务标记为一个简单的Web API,并避免使用“营销术语”请进一步休息。

如果投票人能够解释他在投票失败后的理由,以改进答案,那就太好了,因为没有任何信息会泄露出来