我有一个资源foo,其结构如下:
GET /foo/1
返回:
{
"id": 1,
"server-key": "abcdef",
"status": "expired"
}
状态可以是活动或过期。如果已过期,我希望服务器生成一个新的。
通常我会向PUT/PATCH foo/1
发出新密钥,但客户端不知道密钥生成算法。我也可以在没有身体的情况下做POST foo/1/server-key
,但这感觉很奇怪(我知道这不是很科学的原因)。
有什么好主意/模式吗?
如果实体过期,只需在/foo上进行POST调用,而不带任何参数,服务器应返回新实体(HTTP响应代码应为201):
{
"id": 2,
"server-key": "xyz",
"status": "active"
}
如果某个资源已过期,则无法通过PUT/PATCH请求使其再次处于活动状态。
我会采用的方法是将空值设置为server-key
并让服务器处理它,但我这样做是因为在我的API中,服务器用默认值填充缺失的值是一致的行为。
除此之外,按照另一个答案中的建议,对URI进行简单的POST就足够了。
我认为您应该在您的案例中使用PUT
/PATCH
方法来请求在过期时生成令牌。一般来说,在资源路径中放入操作名称并不是真正的RESTful;-)
我会看到这样的东西:
- 获取元素:
GET /foo/1
- 如果状态已过期,请要求生成新的服务器密钥:
POST /foo/1
。在这种情况下,此方法将用于在服务器端执行重新初始化密钥的操作
使用方法PUT
对应于用客户端提供的新表示来更新完整表示。使用方法PATCH
,将对表示进行部分更新。
这里有一个链接,可以为您提供一些关于设计Web API(RESTful服务)的方法的提示:https://templth.wordpress.com/2014/12/15/designing-a-web-api/.
希望它能帮助你,Thierry