我尝试使用Google搜索和搜索,但无法找到关于此主题的最终权威。虽然忠于REST原则,但我应该如何设计HTTP接口:
有序列表(获取,添加,插入位置,重新排序,删除)
一组(获取,添加,删除)
哈希表(获取,添加,删除)
注意:这些数据结构包含对已知ID的现有资源的引用
答案 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
您无法直接定义此类界面。
有序列表(获取,添加,插入位置,重新排序,删除)
通过排除“插入位置”和“重新排序”,您可以完美地实现“获取”,“添加”和“删除”,例如:
这是一个非常粗略的例子,虽然它概述了一些想法。为了实现“重新排序”和“插入位置”,您需要实现自己的动作语义,您可以将其包含在资源表示中,让客户端知道如何执行这些操作。作为参考,您可以看到此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"
},
]