use*_*823 5 architecture api rest json hateoas
我正在开发一个在线游戏,角色可以对其他对象和角色执行复杂的动作.我正在构建一个REST API,并且在尝试遵循一些最基本的标准时遇到很多麻烦.我知道REST并不总是答案,但由于各种原因,我使用REST是有道理的,因为API的其余部分恰当地使用了它.
以下是一些棘手的例子:
GET/characters/bob/items这将返回Bob携带的项目数组.
我需要针对这些项目执行各种"操作",并且我很难将其建模为"资源".
以下是一些潜在的操作,具体取决于项目的性质:扔,吃,掉,保持
这很复杂,因为这些"操作"仅适用于某些项目.例如,你不能吃剑.此外,'eat'基本上具有"删除"资源的副作用.使用'throw'也可以'删除'资源.使用'drop'可以将资源"转换"为另一种资源类型.'投掷'要求我提供'位置'."保持"要求我提供哪一只手来容纳物品.那么如何将这些操作建模为资源?它们都不是"相似的",因为它们各自需要不同的参数并导致完全不同的行为.
目前,我有一个'actions'资源,我将这些任意操作发布到.但这感觉太过RPC和非标准/可发现:
POST/actions/throw {characterId:5,itemId:10,x:100,y:150}
我尝试尽可能坚持资源和GET/POST/PUT/PATCH/DELETE,但基本动词倾向于直接映射到CRUD调用.如果没有其他信息,通常无法映射其他更复杂的操作.
关注资源,我可能会做这样的事情(向资源发布消息):
POST /characters/bob/items/{bombId}?action=throw
POST /characters/bob/items/{foodId}?action=eat
POST /characters/bob/items/{potionId}?action=add&addedItem={ingredientId}
Run Code Online (Sandbox Code Playgroud)
当操作不适合该项目时返回错误.