可以使用任何一种方法,具体取决于您的要求,但这并不意味着它们没有显着差异。 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 可以更直接地进行操作,但它们不是标准化的,您必须为其设计和记录自己的语法。