根据您的要求,可以使用任何一种方法,但这并不意味着它们没有显着差异。HTTP 方法不是 CRUD。PUT 或 POST 不是创建和更新,反之亦然。
PUT用提供的实体完全替换给定 URI 处的资源,因此它可以用于创建和更新,但前提是它包含完整表示。在 PUT 之后立即发出的 GET 请求应该返回相同的资源。表示可能完全相同,尽管服务可以添加 PUT 表示中缺少的默认值。
POST 告诉服务器,提供的实体从属于给定 URI 的资源,并且他们就应该如何处理达成一致。它可能是任何东西,一个创建,一个更新,任何 HTTP 本身没有标准化的操作。
考虑到这一点,如果您要替换由 URI 标识的整个集合,则使用 PUT 进行批量插入或更新仅是 RESTful。这不一定是与该媒体类型关联的整个集合。URI 可以具有对数据集进行切片的查询字符串,并且您仅对该切片执行批量操作。
例如,如果您有以下集合资源:
GET /api/products
代表:
{'products': [product1, product2, product3]}
如果您想再添加三个产品,使用 PUT 的批量操作必须将您的新产品附加到现有产品并将整个集合发回:
PUT /api/products
{'products': [product1, product2, product3, product4, product5, product6]}
但是,如果您有一个过滤器约束,您可以应用/api/products
该约束将在上面的 GET 上返回一个空集合,那么只对该过滤资源的新产品执行 PUT 就可以了。例如,假设上面的产品可以通过合作伙伴属性过滤,它们有合作伙伴 x,而您正在为合作伙伴 y 添加:
在这种情况下,您可以这样做:
PUT /api/products?partner=y
{'products': [product4, product5, product6]}
GET /api/products
之后返回:
{'products': [product1, product2, product3, product4, product5, product6]}
只要GET /api/products?partner=x
回报:
{'products': [product1, product2, product3]}
并GET /api/products?partner=y
返回:
{'products': [product4, product5, product6]}
这可能看起来很复杂,有时看起来最好使用 POST 而不是 PUT,但请记住,上面的整个操作都是标准化的。它完全按照预期使用 PUT。使用 POST 操作可以更直接,但它们不是标准化的,您必须为其设计和记录自己的语法。