RESTfully更改操作行为

RESTfully更改操作行为,rest,Rest,情况: POST vehicle { colour: 'red', wheels: 4 } 201: { vehicleId: '314-159', colour: 'red', wheels: 4 } 通过POST操作,用户可以根据给定参数创建新资源。如果已经存在由这些相同参数创建的资源,则返回现有资源 如果用户知道资源ID(在创建时生成,实际上是随机的),则可以获取该资源。我想为用户提供一种只知道创建参数而不创建新资源来检查存在性的方法 问题: P

情况:

POST vehicle
{
    colour: 'red',
    wheels: 4
}

201: {
    vehicleId: '314-159',
    colour: 'red',
    wheels: 4
}
通过
POST
操作,用户可以根据给定参数创建新资源。如果已经存在由这些相同参数创建的资源,则返回现有资源

如果用户知道资源ID(在创建时生成,实际上是随机的),则可以
获取该资源。我想为用户提供一种只知道创建参数而不创建新资源来检查存在性的方法

问题:

POST vehicle
{
    colour: 'red',
    wheels: 4
}

201: {
    vehicleId: '314-159',
    colour: 'red',
    wheels: 4
}
POST
正文中采取某种“仅检查”属性以防止创建新资源是否是RESTful的

一个例子:

POST vehicle
{
    colour: 'red',
    wheels: 4
}

201: {
    vehicleId: '314-159',
    colour: 'red',
    wheels: 4
}


编辑

大部分讨论都围绕着
POST
操作是否应该是幂等的展开,这虽然有效,但并没有解决我的问题

我想为我的用户提供一种仅基于用于创建资源的属性来验证资源是否存在的方法

POST
方法的幂等性是无关的。缺少此检查会导致后续的
GET
请求受到影响,这些请求将包含大量从未打算使用的资源,并使查找有用信息变得更加困难


包含“不创建”标志的
POST
请求将满足此需求,但可能感觉不到安宁。

实现幂等POST怎么样?这样做可以避免“检查”body参数。

2思路:

使用PUT键和自然键

一个选择(不确定这是否适用)是在url中不使用某些数据库id,而是使用更像自然键的东西

因此,您不必在某个集合上发布,只需将该项目:

PUT /vehicles/colour/blue/wheels/8
PUT
也可以用于创建。您可以使用这样的标题来防止覆盖现有值:

If-None-Match: *
不要让客户端执行此操作

如果用于创建项目的
POST
与用于更新项目的POST相同,该怎么办?或者,如果对现有项目调用
POST
,它实际上什么都不做

也许客户端不需要知道它是否刚刚创建了一个新项目,或者服务器是否已经有了该项目

只要确保在这两种情况下服务器的行为相同,您就应该很好

如果用户知道资源ID(在创建时生成,实际上是随机的),则可以获得此资源。我想为用户提供一种只知道创建参数而不创建新资源来检查存在性的方法

你会如何使用一个网站

对于表单,可能会接受相同的创建参数作为输入。用户实际上正在执行搜索,这是一种语义安全的操作,因此表单可能会使用GET方法,并将表单中的参数编码到查询字符串中

端点在接收到该请求时,可以将其重定向到适当的资源(如果已经存在)或另一个资源,以便在其不存在时处理该情况

在帖子正文中使用某种“只是检查”属性来防止创建新资源,这是RESTful吗

当然-再说一次,你会如何在网站上做到这一点?表单将有一个额外的复选框,设置为正确的默认行为,但在提交表单之前,用户可以选择更改它

由于切换复选框会将语义从安全操作更改为不安全操作,因此您可能希望在提交期间更改表单上的方法——HTML本身不会这样做,但您可以使用javascript来完成


使用POST进行操作并不理想,因为通用组件无法判断操作是否安全。这意味着,如果响应丢失,他们无法知道自动重试请求,他们没有正确的默认缓存行为,等等。

对于记录,选择的解决方案是在
GET
方法上为特殊情况添加选项


如中所述,执行这种类型的操作并不完全符合
POST
方法的精神,它会混淆呈现给用户的模型。

可以,但我建议如果实体存在,使用“409冲突”响应代码,如果实体创建,则使用200。是的,409更好!幂等post的问题(如果我正确理解这个术语的话)是,它会导致在检查存在性时创建“垃圾资源”。这可能导致用户在检索列表时不得不费力地浏览大部分空的资源对象的不良情况。另一个被考虑的选项是更健壮的过滤功能,但是提议的方法看起来更直接(假设它不是REST no no)。你的意思是说put?我所说的幂等post的意思是,无论提交多少次这样的post请求,你都会得到相同的响应。当您想要支持重试能力时,这尤其有用。有多种方法可以实现这一点,但想到的一个简单解决方案是,首先按颜色和轮子进行查找,然后返回找到的实例(如果有),或者创建一个新实例。这样做时,您的客户端不必担心在尝试重试时更改请求。如果幂等性不是一个选项,那么我认为比您描述的发布请求以检查存在性更restful的是允许对vehicles collection资源进行筛选。因此,要检查是否存在4个车轮的红色车辆,请提交一份上车/车辆?车轮=4&颜色=红色,这将返回所有匹配车辆的列表。如果您需要更复杂的条件,可以查看RQL。不幸的是,ID在整个系统中都被使用,因此它必须