假设我必须实现游戏角色资源。角色可能只有一种武器。 武器类型不同(剑,刀,枪等)并具有不同的属性集。 为了可用性,角色和武器是单独的资源。 在OOP模型中,它将如下所示
为这种结构设计URI和资源的最佳方法是什么?
编辑: 一般来说。是否可以使用返回刀,剑或枪的武器资源的角色资源链接,或者它必须是某些资源的链接,例如http:\ game.com \ character \ sword?
答案 0 :(得分:1)
通常,REST模型可以直接映射为“对象”< - > “表示”和“OID /参考”< - > “URI”。首先,您要做的是为游戏中存在的每个元素分配不同的URI。
假设你使用JSON来描述角色,所以你会有这样的东西:
网址:/ character / Warrior
内容强>:
{ "name" : "Warrior", "weapon" : "/weapons/id_of_weapon" }
注意“武器”如何包含角色所拥有的不同武器的链接(或其中一组)。遵循REST原则的每一个都由URI标识。
现在您有两个选项来支持类型/子类型变体:
当您获得资源/weapons/id_of_weapon
时,您将获得服务器的响应,其中标题如下所示:
HTTP/1.1 200 OK
...
Content-Type: my-game/Knife
... (more headers)
Knife data Content
这标识返回的元素的实际类型,并可用于将其映射到不同的子类型。您可以使用不同的方案,例如Weapon/Knife
或MyGameObject/Weapon_Knife
。
此外,您可以显式设置返回实例的类型。在这种情况下,您可以得到这样的回复:
HTTP/1.1 200 OK
...
Content-Type: application/json
... (more headers)
{ "type" : ["Weapon", "Knife"] , ... (rest of fields) }
请注意type
JSON参数如何用作游戏中的标准,以指定返回数据支持的不同类型。
在编辑之后,您还可以考虑模仿URI中的资源包含架构。但是,您建议http://whatever/character/sword
。这是不合适的,因为您命名的是类,而不是资源。更合适的URL方案类似于:
http://whatever/character/idc/weapon/idw
其中idc
和idw
分别是角色和武器的标识符。请注意,您没有在资源URI中修复武器的确切类型(也就是说,您必须说weapon
,而不是knife
),但可能会发生实际上,身份idw
的武器实际上是Knife
类型的武器(使用上面给出的任一选项)。
如果将包含映射到URI,您还可以使用更紧凑的字符格式,如下所示:
{ "id": "idc",
"name" : "Warrior",
"weapon" : { "id": "idw", "type": "Knife", (rest of knife properties) }
}
请注意:每个元素都有自己的id
。通过JSON递归对象包含来观察包含,您还可以指定武器的类型,并且,您仍然可以映射刚才描述的URL方案以访问角色的内部元素。