为集合添加复杂资源的最佳实践?

时间:2011-06-20 00:57:16

标签: rest resteasy

想象一下RESTful服务,让游戏中的玩家向服务器提交命令。表示此命令的对象可能称为PlayerCommand,如下所示:

PlayerCommand:
Player player;
Game game;
Command command;
String param1;
...etc.

Player,Game和Command也是服务中的对象/资源。当我公开PlayerCommand资源以允许玩家添加这些资源时,最好只公开一个PlayerCommand端点,然后他们会发布一个格式良好的PlayerCommand资源表示,即POST / playerCommand?或者更好的方法是让他们通过在路径中放置依赖资源的ID来掩盖PlayerCommand对象的一些复杂性,例如, POST / player / {id} / game / {id} / playerCommand?似乎后者对客户来说更容易,让它们通过对象的稀疏表示(基本上只是命令和字符串参数),然后让服务器端根据ID构建依赖对象。

基本上,当在嵌套/复杂资源上公开CRUD操作时,这里的最佳做法是什么?

1 个答案:

答案 0 :(得分:1)

缩小任何资源设计要求的一个好方法是假设对其URI的GET将向客户端发送完全相同的表示形式,客户端将PUT转换为该URI,反之亦然。 / p>

当你发布一个PlayerCommand表示时,我假设你想要创建一个新的PlayerCommand资源。当你在PlayerCommand资源上从GET返回这样的东西时,你会返回什么?完整的播放器,游戏和Command对象嵌入在响应中?最好不要;相反,返回指向那些资源的URI。

类似地,POSTed表示不应嵌入Player,Game或Command资源的完整表示;相反,它应该以URI的形式包含它们的标识符。然后,服务器可以存储引用,而无需为它们创建新对象。基于JSON的示例:

{"self": "/playerCommand/9803495",
 "player": "/players/84",
 "game": "/games/22980",
 "command": {"base": "/commands/fight",
             "params": ["kick", "Darrel"]
             }
 }