我尝试在任何地方进行谷歌搜索和搜索,但找不到关于这个主题的权威权威。在忠实于 REST 原则的同时,我应该如何设计 HTTP 接口:
有序列表(获取、添加、插入位置、重新排序、删除)
一组(获取、添加、删除)
哈希表(获取、添加、删除)
注意:这些数据结构将包含对具有已知 ID 的现有资源的引用
我尝试在任何地方进行谷歌搜索和搜索,但找不到关于这个主题的权威权威。在忠实于 REST 原则的同时,我应该如何设计 HTTP 接口:
有序列表(获取、添加、插入位置、重新排序、删除)
一组(获取、添加、删除)
哈希表(获取、添加、删除)
注意:这些数据结构将包含对具有已知 ID 的现有资源的引用
这就是我对有序列表和哈希表的处理方式。我猜对于集合和列表的方法是相同的:
获取项目 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
@dadads
你不能直接定义这样的接口。
有序列表(获取、添加、插入位置、重新排序、删除)
通过排除“插入位置”和“重新排序”,您可以完美地实现“获取”、“添加”和“删除”,例如:
这是一个非常粗略的例子,尽管它概述了一些想法。为了实现“重新排序”和“插入位置”,您需要实现自己的操作语义,您可以将其包含在资源表示中,并让客户知道如何执行这些操作。作为参考,您可以查看此 JSON PATCH 规范提案:https ://www.rfc-editor.org/rfc/rfc6902 ,它试图描述此类操作。
不必使用现有的媒体格式,您可以在自己的命名空间下定义自己的媒体格式,例如:application/vnd.your-company.format-name+json 描述这些功能并将此信息发布给客户端。
您应该将传输机制与底层应用程序分离。我会考虑正确设计应用程序,然后弄清楚如何通过 HTTP 访问它。通过这种方式,您可以轻松添加或更改传输机制(SOAP、SCA 等),而不会影响底层应用程序。
正确设计应用程序后,请考虑通过适配器或访问者模式等从 HTTP 请求访问它。
这是我重新排序的想法。
有一种称为 PATCH 的 HTTP 方法用于更新资源的片段。为您的资源提供一个名为 的新属性index
,然后使用 PATCH 方法进行调用
PATCH /collection
[
{
"id: "original index 0"
"index": 1
}
{
"id: "original index 1"
"index": 0
}
]
然后您的服务器后端需要弄清楚如何以原子方式执行此操作。但就接口而言,我认为这是忠于 RESTful 的最佳方式。
或者,有一个更好的解决方案,但它可能不适用于每个人的情况。由于排序总是取决于某种标准,它甚至可以像插入顺序一样简单。让您的集合 url 支持一个orderBy
查询字符串,并让它orderBy
决定结果的排序方式。然后在来自客户端的重新排序调用期间,只需更新用于排序条件的资源属性。
我来这个问题主要是为了寻找一种 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']
同样显然,当您执行GET
on时,您会以正确的顺序返回列表中的项目/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"
},
]