RESTful数据结构模式

时间:2012-06-11 08:05:46

标签: http design-patterns rest data-structures

我尝试使用Google搜索和搜索,但无法找到关于此主题的最终权威。虽然忠于REST原则,但我应该如何设计HTTP接口:

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

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

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

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

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

@dadads

您无法直接定义此类界面。

  

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

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

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

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

没有必要使用现有的媒体格式,您可以在自己的命名空间下定义自己的媒体格式,例如:application / vnd.your-company.format-name + json,它描述了这些功能,并且还将这些信息通告给客户

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

这是我重新排序的想法。

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

进行调用
PATCH /collection

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

然后您的服务器后端需要弄清楚如何以原子方式执行此操作。但是在界面方面,我认为这是保持RESTful真实的最佳方式。

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

答案 4 :(得分:0)

I came to this question mostly looking for a RESTful way to reorder. I don't really like any of the answers, so here is what I think is most RESTful.

For reorder you could make the order a resource:

/list/order

Then you can do normal operations on it (for these examples assume a list with 5 items currently in it):

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

Note that "order" is not included in the resource response. It's not needed - the order is implicitly specified by the response order of the items.

GET /list/order

returns a list of item ids in their correct order

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

POST /list/order with payload ['D','B','C','A','E']

GET /list/order

returns a list of item ids in their correct order

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

Also obviously you would return the items in the list in the correct order when you do a GET on /list.

GET /list

returns a list of items in their correct order

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