7

我尝试在任何地方进行谷歌搜索和搜索,但找不到关于这个主题的权威权威。在忠实于 REST 原则的同时,我应该如何设计 HTTP 接口:

  1. 有序列表(获取、添加、插入位置、重新排序、删除)

  2. 一组(获取、添加、删除)

  3. 哈希表(获取、添加、删除)

注意:这些数据结构将包含对具有已知 ID 的现有资源的引用

4

5 回答 5

10

这就是我对有序列表和哈希表的处理方式。我猜对于集合和列表的方法是相同的:

有序列表

获取项目 123:

GET /list/123

将一个项目附加到列表中:

POST /list/

将新项目插入位置 5:

POST /list/?position=5

将项目 123 移动到位置 3:

PUT /list/123?position=3

删除第 123 项:

DELETE /list/123

删除位置 3 的项目:

DELETE /list/?position=3

当然,您的 API 在进行插入和删除时应该更新所有元素的索引。

哈希表

获取项目“somekey”:

GET /hashtable/somekey

添加项目“somekey”:

POST /hashtable/somekey

删除项目“somekey”:

DELETE /hashtable/somekey
于 2012-06-11T08:13:39.657 回答
2

@dadads

你不能直接定义这样的接口。

有序列表(获取、添加、插入位置、重新排序、删除)

通过排除“插入位置”和“重新排序”,您可以完美地实现“获取”、“添加”和“删除”,例如:

  • 你定义你的资源 /service/users
  • 您可以使用 POST /service/users 将新用户添加到“用户”集合
  • 您可以 GET /service/users 检索用户
  • 您可以 GET /service/users/user-id 检索特定用户
  • 您可以从用户集合中删除 /service/users/user-id

这是一个非常粗略的例子,尽管它概述了一些想法。为了实现“重新排序”和“插入位置”,您需要实现自己的操作语义,您可以将其包含在资源表示中,并让客户知道如何执行这些操作。作为参考,您可以查看此 JSON PATCH 规范提案:https ://www.rfc-editor.org/rfc/rfc6902 ,它试图描述此类操作。

不必使用现有的媒体格式,您可以在自己的命名空间下定义自己的媒体格式,例如:application/vnd.your-company.format-name+json 描述这些功能并将此信息发布给客户端。

于 2012-06-11T08:13:59.020 回答
1

您应该将传输机制与底层应用程序分离。我会考虑正确设计应用程序,然后弄清楚如何通过 HTTP 访问它。通过这种方式,您可以轻松添加或更改传输机制(SOAP、SCA 等),而不会影响底层应用程序。

正确设计应用程序后,请考虑通过适配器或访问者模式等从 HTTP 请求访问它。

于 2012-06-11T08:42:01.940 回答
1

这是我重新排序的想法。

有一种称为 PATCH 的 HTTP 方法用于更新资源的片段。为您的资源提供一个名为 的新属性index,然后使用 PATCH 方法进行调用

PATCH /collection

[
  {
    "id: "original index 0"
    "index": 1
  }
  {
    "id: "original index 1"
    "index": 0
  }
]

然后您的服务器后端需要弄清楚如何以原子方式执行此操作。但就接口而言,我认为这是忠于 RESTful 的最佳方式。

或者,有一个更好的解决方案,但它可能不适用于每个人的情况。由于排序总是取决于某种标准,它甚至可以像插入顺序一样简单。让您的集合 url 支持一个orderBy查询字符串,并让它orderBy决定结果的排序方式。然后在来自客户端的重新排序调用期间,只需更新用于排序条件的资源属性。

于 2013-12-09T20:11:52.440 回答
0

我来这个问题主要是为了寻找一种 RESTful 方式来重新排序。我真的不喜欢任何答案,所以这是我认为最 RESTful 的。

对于重新排序,您可以将订单作为资源:

/list/order

然后您可以对其进行正常操作(对于这些示例,假设列表中当前包含 5 个项目):

"items":" [
     {
         "id": "A",
         "name": "Monkey"
     },
     {
         "id": "B",
         "name": "Cow"
     },
     {
         "id": "C",
         "name": "Horse"
     },
     {
         "id": "D",
         "name": "Turkey"
     },
     {
         "id": "E",
         "name": "Tasmanian Devil"
     },
]

请注意,“订单”不包含在资源响应中。不需要 - 顺序由项目的响应顺序隐式指定。

GET /list/order

以正确的顺序返回项目 ID 列表

['A','B','C','D','E']

POST /list/order 带有效载荷['D','B','C','A','E']

GET /list/order

以正确的顺序返回项目 ID 列表

['D','B','C','A','E']

同样显然,当您执行GETon时,您会以正确的顺序返回列表中的项目/list

GET /list

以正确的顺序返回项目列表

"items":" [
     {
         "id": "D",
         "name": "Turkey"
     },
     {
         "id": "B",
         "name": "Cow"
     },
     {
         "id": "C",
         "name": "Horse"
     },
     {
         "id": "A",
         "name": "Monkey"
     },
     {
         "id": "E",
         "name": "Tasmanian Devil"
     },
]
于 2016-04-04T17:56:54.473 回答