“RESTful”API中的操作

时间:2014-11-21 15:46:30

标签: rest asp.net-web-api asp.net-web-api2 api-design

我有幻灯片。每个幻灯片都包含幻灯片。

以下内容将返回幻灯片中已订购幻灯片的列表:

GET api/slideshows/123/slides

{
    {
        slideId : "22",
        name : "My slide"
    },
    {
        slideId : "25",
        name : "My second slide"
    },
    {
        slideId : "26",
        name : "Another slide"
    }
}

我想执行以下操作,例如:

将幻灯片26移动到幻灯片22

之后的位置

公开此类请求的好方法是什么?

要么我们可以以不同的顺序对整个幻灯片集合进行PUT,但如果碰巧有更多变化,这将取代所有幻灯片数据。此外,它可能需要传输大量数据。

PUT api/slideshows/123/slides

另一种选择是提供moveAfter“操作”:

POST api/slideshows/123/slides/26?action=moveAfter
body: 
{
    referenceId : "22"
}

我知道这不完全是RESTful,但还有其他实用的解决方案吗?

2 个答案:

答案 0 :(得分:1)

我会这样做:PUT api/slideshows/123/slides/26/position 22

顺便说一下。挺有趣的。你可以用两种方式做到:

  • 每张幻灯片都有唯一的ID,不依赖于订单
  • id与订单索引(或位置)相同 - 在这种情况下,您必须在每次移动后更新整个集合,因为服务器维护资源状态而不是客户端,因此速度会慢得多。

答案 1 :(得分:1)

我会选择以下设计。

  • 这里的关键点是幻灯片的幻灯片只是一个指向组成幻灯片资源的URI数组。要从幻灯片中重新排序,添加或删除幻灯片,可以使用新幻灯片阵列修改幻灯片显示资源。

  • 创建幻灯片独立于引用幻灯片的幻灯片。幻灯片和幻灯片之间的关联只能通过在幻灯片放映资源上执行PATCH来更改。

  • 资源URI不会深深嵌套。这是一个糟糕的设计选择,可以在以后再次咬你。

我用一系列请求 - 响应对来说明它。

GET /slideshows/17
200 OK
{
    "slideshow_id": 17,
    "slides": [
        "/slides/15",
        "/slides/42",
        "/slides/76",
        "/slides/31"
    ]
}

POST /slides
{
    "content": "..."
}
201 Created
Location: /slides/93

GET /slides/93
200 OK
{
    "slide_id": 93,
    "slideshow_association": null,
    "content": "..."
}

PATCH /slideshows/17
{
    "slides": [
        "/slides/15",
        "/slides/31"
        "/slides/42",
        "/slides/76",
        "/slides/93"
    ] 
}
204 No Content

GET /slides/93
200 OK
{
    "slide_id": 93,
    "slideshow_association": {
        "slideshow": "/slideshows/17",
        "index": 4,
        "previous_slide": "/slides/76",
        "next_slide": null
    },
    "content": "..."
}