POST 中的可变负载
Variable payloads in POST
这更像是一个设计问题。可以说我有一个端点来创建一个家。每个家庭都有一个地址和其他特征。现在让我们关注地址。
设想一个我们可以 post 到 /home 的遗留世界,其中包含一个 address_id 的有效负载,它是对具有地址验证的外部系统的引用等
现在我们希望支持创建地址(在外部系统中)以简化我们的客户需要进行的调用次数。一个客户 would/could 只是打电话给我们创建一个家,指定地址值,而不是 2 个电话。
在 /home 中输入 POST 并指定 address_id 或 address_value 字符串(但不能同时指定两者)。这将使我们的服务器查看有效负载,决定是否需要代表客户端调用外部地址系统,具体取决于 [=33] 中显示的字段(address_id 与 address_value) =]有效负载。
问题:
基于请求中字段的可变行为,感觉像是一种反模式。这也感觉像是遗留领域和我们试图支持的新领域之间的紧密耦合。
另一种选择是我们引入一个新端点,它采用只有地址值的新有效负载,并最终弃用旧端点address_id。
还有其他设计方案吗?
Variable behavior based on fields within a request, feels like an anti-pattern.
它可能不像它给人的感觉那样是反模式。
从历史上看,SOAP 和最近的 GraphQL 在很大程度上是“POST 资源的有效负载,我们会在另一端解决它”。
HTTP is an application protocol whose application domain is the transfer of documents over a network. -- Jim Webber, 2011
REST 限制我们使用一组有限的消息——“五个动词和真相”——所以在某些地方肯定会有一些重叠。
我们期望 POST 处理多种消息的原因是缓存失效规则适用于目标资源。所以我们想使用 invalidate 已被客户端缓存的正确表示的目标。
所以在 HTML 中,我们可能有许多不同的表单,它们都 POST 到一个资源,因为成功处理这些表单会使该资源的缓存表示无效。
是的,这意味着在服务器端,当我们使用的框架仅支持基于请求元数据的路由时,我们可能需要手动滚动一些我们自己的路由逻辑。
这并不是说您不能选择使用更细粒度的资源——这也没关系。但它们“应该”是具有自己表示的资源,而不仅仅是每个“职责”具有不同拼写的 RPC 端点。
这更像是一个设计问题。可以说我有一个端点来创建一个家。每个家庭都有一个地址和其他特征。现在让我们关注地址。
设想一个我们可以 post 到 /home 的遗留世界,其中包含一个 address_id 的有效负载,它是对具有地址验证的外部系统的引用等
现在我们希望支持创建地址(在外部系统中)以简化我们的客户需要进行的调用次数。一个客户 would/could 只是打电话给我们创建一个家,指定地址值,而不是 2 个电话。
在 /home 中输入 POST 并指定 address_id 或 address_value 字符串(但不能同时指定两者)。这将使我们的服务器查看有效负载,决定是否需要代表客户端调用外部地址系统,具体取决于 [=33] 中显示的字段(address_id 与 address_value) =]有效负载。
问题: 基于请求中字段的可变行为,感觉像是一种反模式。这也感觉像是遗留领域和我们试图支持的新领域之间的紧密耦合。
另一种选择是我们引入一个新端点,它采用只有地址值的新有效负载,并最终弃用旧端点address_id。
还有其他设计方案吗?
Variable behavior based on fields within a request, feels like an anti-pattern.
它可能不像它给人的感觉那样是反模式。
从历史上看,SOAP 和最近的 GraphQL 在很大程度上是“POST 资源的有效负载,我们会在另一端解决它”。
HTTP is an application protocol whose application domain is the transfer of documents over a network. -- Jim Webber, 2011
REST 限制我们使用一组有限的消息——“五个动词和真相”——所以在某些地方肯定会有一些重叠。
我们期望 POST 处理多种消息的原因是缓存失效规则适用于目标资源。所以我们想使用 invalidate 已被客户端缓存的正确表示的目标。
所以在 HTML 中,我们可能有许多不同的表单,它们都 POST 到一个资源,因为成功处理这些表单会使该资源的缓存表示无效。
是的,这意味着在服务器端,当我们使用的框架仅支持基于请求元数据的路由时,我们可能需要手动滚动一些我们自己的路由逻辑。
这并不是说您不能选择使用更细粒度的资源——这也没关系。但它们“应该”是具有自己表示的资源,而不仅仅是每个“职责”具有不同拼写的 RPC 端点。