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

在这里,我嘲笑编号总是等于一,但我觉得这是超级哈克,当然不是不言自明的......此外,我有一个名称冲突: idcontextId 。 资源名称是单数而不是复数。

解决方案#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

下一篇: How is data sent in REST web services