Angularjs 一款游戏的RESTAPI

Angularjs 一款游戏的RESTAPI,angularjs,spring,rest,web-services,web,Angularjs,Spring,Rest,Web Services,Web,我正在开发一个web分布式应用程序,让任何用户都可以玩克朗代克(纸牌)游戏。我想开发一个API REST,但我不确定资源URL应该是什么样子 在服务器端,我有“游戏”、“股票”、“浪费”、“表格”、“基金会”等课程。游戏类有moveFromStockToWaste、moveFromTableauToTableu。。。它实现了游戏的动作 关于RESTAPI,我读到的是,资源URL应该看起来像一个名词的层次结构,而对这些名词的操作(动词)是HTTP方法(GET、PUT、POST、PATCH)。 虽然

我正在开发一个web分布式应用程序,让任何用户都可以玩克朗代克(纸牌)游戏。我想开发一个API REST,但我不确定资源URL应该是什么样子

在服务器端,我有“游戏”、“股票”、“浪费”、“表格”、“基金会”等课程。游戏类有moveFromStockToWaste、moveFromTableauToTableu。。。它实现了游戏的动作

关于RESTAPI,我读到的是,资源URL应该看起来像一个名词的层次结构,而对这些名词的操作(动词)是HTTP方法(GET、PUT、POST、PATCH)。 虽然moveFromTableauToTableau资源是一个动词而不是名词,但我不确定通过API REST将卡片从库存转移到废弃物的方式是否应该是这样:

 UPDATE /player/{playerId}/game/{gameId}/moveFromTableauToTableau
我还有另外一种方法,就是使用这个表格:

 URL: /player/{playerId}/game/{gameId}/TableauPile/1/ 
然后依次拥有资源,如未翻转的卡片数量和翻转的卡片(所有关于表格所需的信息)。 然后通过删除最后一张卡来更新此表堆资源:

DELETE /player/{playerId}/game/{gameId}/TableauPile/1/upTurnedCard/3
然后将删除的卡放入通过新卡套装和价值的目标:

POST /player/{playerId}/game/{gameId}/TableauPile/3/upTurnedCard

但是这样REST API就可以将一张卡从桌面移动到垃圾箱,这不是一个有效的移动。

我一直认为设计REST API是一项非常不容易的任务

第二种方法在命名约定方面似乎更干净,但我认为您永远不应该为了符合这些要求而牺牲目标系统的完整性。当您允许在两个http调用中执行一个原子操作时,它实际上不再是原子操作,并且在网络故障或任何调用由于某种原因失败时,您的系统将处于不可预测的状态。避免这类问题必须是当务之急

一个想法可能是从招式集合的角度思考招式。所以对于一个游戏,你有一个移动资源。然后,您可以使用一些额外的请求参数(如

POST/players/{playerId}/games/{gameId}/moves?type=TABLEAU_TO_TABLEAU
Body: 
{
  "src": "stock",
  "dest": "waste"
}
这样你应该有足够的灵活性来处理不同类型的移动

此外,我建议您使用复数形式命名资源:

玩家->玩家

游戏->游戏

所以

GET/players自然意味着给我玩家资源的所有值


GET/players/1意味着给我playerId=1的限制的playerId资源中的player,我一直认为设计restapi是一项非常不容易的任务

第二种方法在命名约定方面似乎更干净,但我认为您永远不应该为了符合这些要求而牺牲目标系统的完整性。当您允许在两个http调用中执行一个原子操作时,它实际上不再是原子操作,并且在网络故障或任何调用由于某种原因失败时,您的系统将处于不可预测的状态。避免这类问题必须是当务之急

一个想法可能是从招式集合的角度思考招式。所以对于一个游戏,你有一个移动资源。然后,您可以使用一些额外的请求参数(如

POST/players/{playerId}/games/{gameId}/moves?type=TABLEAU_TO_TABLEAU
Body: 
{
  "src": "stock",
  "dest": "waste"
}
这样你应该有足够的灵活性来处理不同类型的移动

此外,我建议您使用复数形式命名资源:

玩家->玩家

游戏->游戏

所以

GET/players自然意味着给我玩家资源的所有值

GET/players/1表示将playerId=1的限制提供给我玩家资源的玩家

我正在开发一个web分布式应用程序,让任何用户都可以玩克朗代克(纸牌)游戏。我想开发一个API REST,但我不确定资源URL应该是什么样子

甲骨文:作为一个网站,你将如何实现这一点

在服务器端,我有“游戏”、“股票”、“浪费”、“表格”、“基金会”等课程。游戏类有moveFromStockToWaste、moveFromTableauToTableu。。。它实现了游戏的动作

需要了解的一件重要事情是,实现中的类并不重要;REST是关于操纵文档的,游戏中发生的变化是操纵“文档”的副作用

换句话说,RESTAPI是游戏戴上的面具,看起来像一个网站

看吉姆·韦伯的演讲

实际上是一个状态机;任何给定的画面都有一些有限的法律动作要做,每一个动作都会把你带到一个新的位置

因此,您可以对API建模的一种方法是,为每个动作提供一个tableau加上启示(链接)的表示,当您遵循描述可能合法动作的链接时,游戏会从一个状态进展到下一个状态

“只有”8*10^67左右的交易需要担心,对于每一笔交易,你都有一张所有可到达位置的图表,并按遍历顺序排序,然后将它们全部链接在一起

/76543210987654321098765432109876543210987654321098765432109876543210/0
/76543210987654321098765432109876543210987654321098765432109876543210/1
/76543210987654321098765432109876543210987654321098765432109876543210/2
/76543210987654321098765432109876543210987654321098765432109876543210/3
等等

这不是一种安排,尽管它可能不切实际,而且由于URL描述了游戏的整个状态,玩家可以访问隐藏状态

我建议先在不太复杂的事情上尝试这种方法,比如

隐藏状态相对简单,因为当前游戏到特定种子的映射可以在服务器上完成。也就是说,你发送一个帖子到游戏的开始和结束点,这会生成一些随机标识符,并将随机标识符映射到种子位置,然后你就出发了

但这种设计中的一个潜在问题是HTTP是一种无状态协议;当玩家请求
GET/games/000/152
时,服务器无法“知道”客户端以前处于可以合法移动到位置152的位置。您可以创建URI,但仅此而已

您可能想要的是能够确保玩家所做的动作是合法的,这意味着服务器需要跟踪玩家的当前状态