Web services RESTful服务中的自定义操作

Web services RESTful服务中的自定义操作,web-services,rest,uri,Web Services,Rest,Uri,我已经阅读了一段时间关于RESTful服务的文章,并且我理解对资源使用动词的重要性 但有一件事我不明白。如果我们需要调用某个不属于CRUD的操作,会发生什么 例如,我想做一只猫跳。我们应该使用哪种格式 下面的内容是否安静 http://host/cats/123/jump 如果cats/123代表一种资源,那么可以这样考虑:该资源可以有多种状态(吃、走、睡、跳、尿等等)。当您使用REST体系结构样式设计API时,您希望允许客户端应用程序对将更改其状态的资源发出允许的请求 在cats/123的上

我已经阅读了一段时间关于RESTful服务的文章,并且我理解对资源使用动词的重要性

但有一件事我不明白。如果我们需要调用某个不属于CRUD的操作,会发生什么

例如,我想做一只猫跳。我们应该使用哪种格式

下面的内容是否安静

http://host/cats/123/jump

如果
cats/123
代表一种资源,那么可以这样考虑:该资源可以有多种状态(吃、走、睡、跳、尿等等)。当您使用REST体系结构样式设计API时,您希望允许客户端应用程序对将更改其状态的资源发出允许的请求

cats/123
的上下文中,您可以通过一系列POST请求来实现这一点,这些请求将导致资源的状态发生更改。利用REST中的超媒体功能,您可以创建如下所示的请求和响应过程。请注意,允许的链接会随着对帖子的响应而更改。此外,客户端应用程序将按照链接数组中包含的属性而不是Href属性中包含的实际URI进行编码

请求:

GET cats/123
POST cats/123

{
    "Food":"kibbles"
}
答复:

{
    "Color" : "black",
    "Age"   : "2",
    "Links":[
    {
        "Food":"kibbles",
        "Method":"POST",
        "Href":"http://cats/123",
        "Title":"Feed the cat"
    },
    {
        "Scare":"yell real loud",
        "Method":"POST",
        "Href":"http://cats/123",
        "Title":"Scare the cat"
    }]
}
{
    "Color" : "black",
    "Age"   : "2",
    "Tummy" : "full"
    "Links":[
    {
        "Sleep":"lap",
        "Method":"POST",
        "Href":"http://cats/123",
        "Title":"Pet the cat"
    },
    {
        "Scare":"yell real loud",
        "Method":"POST",
        "Href":"http://cats/123",
        "Title":"Scare the cat"
    }]
}
请求:

GET cats/123
POST cats/123

{
    "Food":"kibbles"
}
答复:

{
    "Color" : "black",
    "Age"   : "2",
    "Links":[
    {
        "Food":"kibbles",
        "Method":"POST",
        "Href":"http://cats/123",
        "Title":"Feed the cat"
    },
    {
        "Scare":"yell real loud",
        "Method":"POST",
        "Href":"http://cats/123",
        "Title":"Scare the cat"
    }]
}
{
    "Color" : "black",
    "Age"   : "2",
    "Tummy" : "full"
    "Links":[
    {
        "Sleep":"lap",
        "Method":"POST",
        "Href":"http://cats/123",
        "Title":"Pet the cat"
    },
    {
        "Scare":"yell real loud",
        "Method":"POST",
        "Href":"http://cats/123",
        "Title":"Scare the cat"
    }]
}

对于纯Restful设计,我建议如下:

POST /cats/123/actions
主体为(操作类型在请求中定义:

{
    "actionType": "jump",
    "customActionParameter": "some value"
}
但这将是一种过度的杀伤力。 所以我觉得更容易理解:


这是谷歌在其云基础设施Api中使用的方法,不要将HTTP谓词与域的状态机转换或操作混为一谈

Stripe提供了一个很好的例子,说明如何以restful方式表示状态转换或域操作


域模型上的操作可以通过修改(PUT或补丁)来表示到将在您自己的代码的状态机内触发工作流的状态或状态字段。例如,在您的示例中,跳转操作也可能导致与3x步数相同的状态,因此它可能是对高度或高度字段的修改。然后,您的代码可能会实现某种类型的工作流管理或状态机,然后您可以根据请求的状态更改而不是为实现此更改而执行的“操作”来发出自己的事件和验证规则。

+1.谢谢。但我认为我们应该使用PUT而不是POST来更新资源?我知道POST应该用于创建?不幸的是,讨论(“参数”)关于REST架构风格围绕理解HTTP规范及其包含的定义展开。简言之,表示PUT方法是发送整个资源表示(由客户端更新的实体)的一种方式如果客户端具有最新版本,则服务器可以替换资源的当前表示形式。在问题中,您的“操作”请求的是状态转换,而不是使用更新版本整体替换资源。{空间不足:)},POST是一种使资源表示从一种状态转换到另一种状态的公认方式。我认为这是一个很好的答案。我只想补充一点,这是有理论的,然后人们必须实际与您的RestAPI进行互操作。并非所有库/系统都支持所有HTTP谓词。因此,在野外,我发现最好坚持使用GET、POST、DELETE(如果您真的需要)和PUT(如果您真的需要)。这个答案中的示例API没有限制使用哪些HTTP方法。您可以将设计的API限制为仅支持这些方法。我回答的关键点是,实现Fielding的REST的API应该为API客户端提供与服务器交互的方法,而无需将操作与硬编码URL耦合。在示例API中,客户机代码将使用链接数组中的对象。自2012年以来,已经定义了比我创建的示例更有用的JSON规范。URI标识资源,而不是方法。正确性现在看起来似乎有些过分,但它将为您提供一个灵活、可扩展的设计,使您能够在将来轻松地扩展API。回到原来的问题,更好的解决方案是将方法“命名”,然后将生成的名词作为子资源处理。因此,
/cats/123/跳跃
。想象一下ID为123的猫的跳跃。我喜欢参考的GoogleAPI设计指南。