如何处理动作(动词),这会导致REST发生多种可能的状态更改

时间:2012-05-24 07:03:24

标签: rest

该场景是基于回合制的RPG REST服务。大多数游戏都可以建模为超媒体资源,但是我遇到了一个特定用例的问题。化身想要攻击怪物。你不能让客户端生成最终状态,以防止作弊服务器需要决定是否有命中或命中,如果有命中,要减去多少个命中点。我们还需要可靠性和重复数据删除。

已发布的基本网址:

Req:
GET /game
Res:
HTTP/1.1 200
<world>
 <link rel="avatars" href="/avatars"/>
 <link rel="monsters" href="/monsters"/>
</world>
<link rel="actions" href="/actionqueue"/>

跳过明显的头像和怪物收藏列表。

Req:
GET /avatars/1
Res:
HTTP/1.1 200
<avatar>
 <name>Puck</name>
 <health>high</health>
 <link rel="weapon" href="/weapon/3">dagger</link>
</avatar>

Req:
GET /monsters/2
Res:
HTTP/1.1 200
<monster>
 <type>snake</type>
 <health>high</health>
 <state>angry</state>
</monster>

获取服务器生成的唯一资源,如果丢失消息,我们不关心重复。

Req:
POST /actionqueue
<action/>
Res:
HTTP/1.1 201
Location:/actionqueue/1234

我们的幂等行动方法。

Req:
PUT /actionqueue/1234
<action>
 <type>attack</type>
 <source>
  <avatar>1</avatar>
 </source>
 <target>
  <monster>2</monster>
 </target>
</action>
Res:
HTTP/1.1 200
<outcome>
 <status>success</status>
 <updated>
  <link rel="monster" href="/monsters/2"/>
 </updated>
</outcome>

所以这里的问题是关于攻击行动。这对我来说有点像RPC,但你怎么处理这样的事情呢?客户端无法提前知道状态更改,因此客户端必须向服务器发送“内容”以启动服务器决定的状态更改。有没有更好的技术?你还会认为这是一个RESTful设计吗?

0 个答案:

没有答案