RESTful API:获取/设置一个没有ID的“全局”单一资源
TL; DR
在我目前的API中,我有两个端点来处理上下文:
GET /context/get
POST /context/set '{"id": "123"}'
从RESTful API访问这个全局,无id状态的推荐方式是什么?
请假定上下文概念不能改变 。
背景
假设我有一个记录的用户。 他默认分配给他可以更改的上下文。
根据上下文,上下文更改后,所有后续API调用将返回不同的数据。
例:
// Backend
Context = "Poland"
然后
$ curl -X GET http://api.myapp.com/cities
将回应:
{
"cities": [{
"id": "1",
"name": Warszawa"
}, {
"id": "2",
"name": Wrocław"
}]
}
但是,如果您更改上下文:
// Backend
Context = "USA"
那么, 相同的 URL:
$ curl -X GET http://api.myapp.com/cities
应该返回不同的数据集:
{
"cities": [{
"id": "3",
"name": New York City"
}, {
"id": "4",
"name": Boston"
}]
}
题
由于上下文只是后端的全局状态,因此它没有id。 它也不属于任何集合。 不过,我希望它可以在API中访问。 我看到有三种可能的解决方案:
解决方案#1 - 现有
设置上下文
$ curl -X POST http://api.myapp.com/context/set '{"id": "123"}'
获取上下文
$ curl -X GET http://api.myapp.com/context/get
这个实际上并不像RESTful API,而且在前端,我必须模拟id(使用ember-data)。 资源名称是单数而不是复数。
解决方案#2 - 嘲笑身份证
设置上下文
$ curl -X POST http://api.myapp.com/context/1 '{"contextId": "123"}'
获取上下文
$ curl -X GET http://api.myapp.com/context/1
在这里,我嘲笑编号总是等于一,但我觉得这是超级哈克,当然不是不言自明的......此外,我有一个名称冲突: id
与contextId
。 资源名称是单数而不是复数。
解决方案#3 - 行动
设置上下文
$ curl -X POST http://api.myapp.com/context/actions/set '{"id": "123"}'
获取上下文
$ curl -X GET http://api.myapp.com/context/actions/get
这与第一个非常类似,但是使用的actions
可能是我整个API设计的一部分(例如从无卡片的设计中获取)。但是,我会遇到一个问题,那就是如何在前端很好地建模它,并且资源名称是单数而不是复数。
有没有#4选项? 我应该如何解决这个问题?
谢谢!
你的三个解决方案是RPC,而不是REST。 不仅他们不是无状态的,而且通过设置一个id来为其他资源设置资源非常RCP'ish。
一个RESTful解决方案,如果你真的想这样做,就是在一个头文件中设置上下文。 客户端应该发送一个X-ContextId
或类似的东西,然后你从中确定你需要的请求上下文。
但是,如果这不是您的应用程序需要的,请不要过多担心RESTful。 我建议在这里阅读答案:SOAP与REST(差异)
从RESTful API访问这个全局,无id状态的推荐方式是什么?
根据定义,RESTful API是无状态的 ,客户端上下文不应该在请求之间存储在服务器上。
如果你想让你的API成为RESTful,你必须在每个请求中传递这个ID。
链接地址: http://www.djcxy.com/p/71481.html上一篇: RESTful API: get/set one "global" single resource without id