Web services 表示以RESTful方式移动资源

Web services 表示以RESTful方式移动资源,web-services,rest,Web Services,Rest,我试图通过构建一个基本的纸牌游戏web服务来学习如何构建一个RESTful web服务。当我试图模拟一个玩家如何从牌组中抽牌时,我被卡住了。我有a/CACKS资源和a/cards资源。随之而来的是两个问题: 1.我下一张卡应该画哪条资源路径?使用GET:/decks/{deckId}似乎是错误的,因为这可能会为我返回整个组。作为GET:/decks/{deckId}/topcard访问资源有意义吗 2.假设GET:/decks/{deckId}/topcard有意义,我知道我不应该使用GET从卡

我试图通过构建一个基本的纸牌游戏web服务来学习如何构建一个RESTful web服务。当我试图模拟一个玩家如何从牌组中抽牌时,我被卡住了。我有a/CACKS资源和a/cards资源。随之而来的是两个问题:

1.我下一张卡应该画哪条资源路径?使用
GET:/decks/{deckId}
似乎是错误的,因为这可能会为我返回整个组。作为
GET:/decks/{deckId}/topcard
访问资源有意义吗

2.假设
GET:/decks/{deckId}/topcard
有意义,我知道我不应该使用
GET
从卡片组的顶部实际移除卡片,因为该操作应该是幂等的。因此,在这种情况下,我们可以:

GET:/decks/{deckId}/topcard
->返回topcardId(不返回卡的实际值。不希望客户端作弊)

POST:/hands/{handId}/cards/{topcardId}
->将先前检索到的topcardId添加到玩家手上。将牌组中的下一张牌设置为topcard资源。返回顶级卡的实际值


我遇到的问题是,在内部修改
/decks/../topcard
资源似乎是错误的,因为这是向其他
/hands/../cards
资源请求
POST
的副作用。这是安静的吗?还有其他选择吗?

我认为你的方法是对的。通过POST,您可以更改Ressource的状态,这对“rest full”服务有效

我试图通过构建一个基本的纸牌游戏web服务来学习如何构建一个RESTful web服务。当我试图模拟一个玩家如何从牌组中抽牌时,我被卡住了。我有a/CACKS资源和a/cards资源

简短版本:您缺少经销商资源

您将消息发布到经销商资源,成功处理该消息的一个副作用是数据模型中的牌组和玩家手的状态得到更新,经销商资源将客户端重定向到新的表示形式。。。好吧,只要符合你的协议。它可以是他们手牌的新代表,也可以是发给他们的两张牌的代表,或者其他什么

吉姆·韦伯在他的演讲中谈到了细节。在较高的层次上:重点在于客户机代码和底层服务可以独立发展(浏览器版本与服务器版本分离),因为即使底层实现需要更改,API层也能提供稳定性

这意味着,如果将资源标识符的拼写与域模型中的实体相耦合,则违反了封装。在REST模型中,您操作资源,并且作为副作用,底层数据模型会发生有趣的事情

试图用四种方法来操纵数据实体,这真是一件痛苦的事。REST中的逃生舱口是允许您拥有任意多的资源

工作(例如:向域模型发出命令)是管理资源的副作用。换句话说,这些资源是反腐败层的一部分。集成域中的资源应该比业务域中的业务对象多得多

简言之,如果需要扩展api以支持新行为,只需创建新资源即可。它们不需要匹配数据模型中的任何内容

现在,HTTP是无状态的,所以您需要考虑服务器需要什么信息来明确地转换请求。在“交易卡”的情况下,这可能很简单,只要清楚地识别正确的牌组和正确的玩家。您主要有三个选项:可以将该信息放在标识符路径的段中、标识符的查询参数中或消息体(即表单变量)中。数据的去向在很大程度上取决于您使用的资源框架和您当地的设计指南

POST /deck/{deckId}/dealer

cards=2&toPlayer={playerId}
这将是一种选择

我遇到的问题是,在内部修改/decks/../topcard资源似乎是错误的,因为这是向其他/hands/../cards资源请求帖子的副作用。这是安静的吗

是的,经常发生。考虑一个博客-你推一个新条目,并且你对条目、feed、其他条目都有新的条目作为新帖子的修改……/P> 在决定缓存策略时,您需要考虑这一点;中间缓存不会知道您发送给一个资源的消息使一组其他缓存项无效

我想我不太明白的是,这与使用HTTP进行RPC有什么不同

一般来说,REST不是RPC的原因是中间组件(缓存、反向代理)可以积极参与请求/响应交换。因为POST(和类似的补丁)既不安全也不幂等,所以您肯定会得到RPC-ish风格。如果您使用PUT语义,而不是PATCH,它会更好一点

但是,请注意,即使使用POST和PATCH,中介机构仍然可以理解消息类型,而不需要了解任何有关目标资源的信息

当我读到“从属”这个词时,我觉得应该期望从中创建一个实际的资源


不足为奇。请注意,语言已在中更改,并且短语“从属资源”不再在该上下文中使用。

即使is在内部修改了不同的资源?我觉得REST调用只会影响URL中引用的资源。我想我明白你的意思了。我猜我错的地方是,我几乎假设URL中的资源和actu之间存在1-1映射