3

编辑:我最初的问题涉及 PUT 请求,我已根据 thecoshman 提供的答案将其更改为 PATCH。

我正在使用檐口开发一个 RESTful 网络服务,我最近发现了漏勺。我的问题与 PATCH 请求有关。我现在知道 PUT 请求应该是完整的记录,但 PATCH 请求不是这样。我可以使用滤锅来验证附加到 PATCH 请求的 json 数据吗?

Colander 非常适合验证 POST 请求,因为它可以确保我的 json 中有所有正确的数据,并且还可以删除任何无关的数据。

这是我的简单模式。

class OrganisationSchemaRecord(MappingSchema):
    orgname = SchemaNode(String())
    fullname = SchemaNode(String())
    description = SchemaNode(String(), missing=drop)

class OrganisationSchema(MappingSchema):
    organisation = OrganisationSchemaRecord()

这使我可以像这样保持我的视图代码简单。

@view(validators=(unique,), renderer='json', schema=OrganisationSchema)
def collection_post(self):
    """Adds a new organisation"""
    org = DBOrg(**self.request.validated['organisation'])#sqlalchemy model
    DBSession.add(org)
    return {'organisation': org}

schema=OrganisationSchema验证请求和位置的 json 主体的神奇之处在于self.request.validated['organisation']按照模式。

它也适用于我的其他验证器,可确保主键尚未使用。

def unique(request):
    if 'organisation' in request.validated: #Implies a validated schema
        orgname = request.validated['organisation']['orgname']
        if DBSession.query(DBOrg).get(orgname):
            request.errors.add('url', 'orgname', 'This organisation already exists!')

但是,如果我想处理 PATCH 请求以更新fullnameordescription字段,则验证将失败,除非该请求还包含orgname我不想更改的值。

什么是最好的解决方案?我是否坚持将完整和有效的记录修补到服务器,我是否定义了不同的模式或者我错过了什么?

4

1 回答 1

2

老实说,跳过了大部分问题,所以希望我没有错过任何太大的问题。

Should PUT requests be full records- 是的,一点没错。

PUT 请求将整个替换记录放在您请求的 URI 中。

如果要执行部分修改,则应使用 PATCH(令人惊讶的是鲜为人知)。在 PATCH 之前,理论是,获取记录,在本地修改,然后将整个记录放回去

于 2014-06-13T13:07:08.590 回答