要解决的问题
RESTful API对于批量操作存在一定的缺陷。例如资源的删除接口:
DELETE /api/resourse//
如果我们要删除100条数据怎么搞?难道要调用100次接口吗?
比较容易想到的是下面两种方案:
用逗号分割放进url里:/api/resource/1,2,3...
将需要删除的资源的id放到请求体里面
对于方案1,由于浏览器对url的长度存在限制,如果操作的资源过多就无法实现。
对于方案2,这种处理方式存在一定的风险,因为根据RPC标准文档,DELETE的请求体在语义上没有意义,一些网关、代理、防火墙在收到DELETE请求后,会把请求的body直接剥离掉。
所以我参考https://www.npmjs.com/package/restful-api,将批量处理的操作名称和数据全部放到请求体里,统一使用POST请求发送:
POST /api/resource/batch/
Body: {
"method": "create",
"data": [ { "name": "Mr.Bean" }, { "name": "Chaplin" }, { "name": "Jim Carrey" } ]
}
POST /api/resource/batch/
Body: {
"method": "update",
"data": { "1": { "name": "Mr.Bean" }, "2": { "name": "Chaplin" } }
}
POST /api/resource/batch/
Body: {
"method": "delete",
"data": [1, 2, 3]
}
Python实现
环境:python==3.6.5, django==2.2, djangorestframework==3.9.4
在GenericViewSet中加入了一些自定义的分发逻辑,将相应的Batch View放在Mixin里实现可重用。
class BatchGen