0

该场景是基于回合的 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 设计吗?

4

0 回答 0