编辑:我原来的问题提到了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}
根据模式,验证请求和地点的json正文的schema=OrganisationSchema
是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请求以更新fullname
或description
字段,则验证将失败,除非请求还包含我不想要的orgname
值改变。
什么是最佳解决方案?我是否坚持要将完整且有效的记录修复到服务器,我是否定义了不同的模式,还是我遗漏了某些内容?
答案 0 :(得分:2)
Should PUT requests be full records
- 是的,绝对。
PUT请求将完整的替换记录放在您请求的URI上。
如果要执行部分修改,则应使用PATCH(其知名度较低)。在PATCH之前,理论将是,获取记录,在本地修改,PUT整个记录回来