必要条件に応じて、どちらの方法も使用できますが、これは、これらに大きな違いがないという意味ではありません。HTTP メソッドは CRUD ではありません。PUT または POST は、Create および Update ではなく、その逆でもありません。
PUTは、指定された URI のリソースを指定されたエンティティに完全に置き換えるため、作成と更新に使用できますが、完全な表現が含まれている場合に限ります。PUT の直後に行われる GET リクエストは、同じリソースを返す必要があります。表現はまったく同じかもしれませんが、PUT された表現に欠けていたデフォルト値をサービスが追加する可能性があります。
POST は、提供されているエンティティが指定された URI のリソースに従属していることをサーバーに通知し、それに対して何を行うべきかについて合意を得ています。作成、更新、HTTP 自体によって標準化されていない操作など、何でもかまいません。
これを念頭に置いて、PUT を使用した一括挿入または一括更新は、URI で識別されるコレクション全体を置き換える場合にのみ RESTful になります。これは必ずしもそのメディア タイプに関連付けられたコレクション全体である必要はありません。URI には、データセットをスライスするクエリ文字列を含めることができ、そのスライスに対してのみ一括操作を実行します。
たとえば、次のコレクション リソースがあるとします。
GET /api/products
に代表される:
{'products': [product1, product2, product3]}
さらに 3 つの製品を追加する場合、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]}
これは複雑に思えるかもしれませんし、PUT の代わりに POST を使用する方が良いように見えることもありますが、上記の操作全体が標準化されていることに注意してください。意図したとおりに PUT を使用しています。操作は POST の方が簡単ですが、標準化されていないため、独自の構文を設計して文書化する必要があります。