Ive solved it both ways, plus an additional way, for a number of routes I maintain.
PUT
I hang a bool property off the representation, `cancelled` or `deleted`. Flip the bool to false and PUT it back. PUT /orders/12345
POST
per the spec allows partial updates. Do the same as the PUT scenario, except partial POST it back. POST /orders/12345
PATCH
the same as the above two, except it's a patch payload describing only the property which has changed.
Less concretely to your question, here's my take from experience on each of these approaches. I'm just going to brain dump some thoughts/questions I've had from the field
PATCH
Its awesome to send just what you need. Very message oriented. There are a few gotchas with patch though.
1. elements of arrays are no longer addressable by their id. Instead, an elements ordinality becomes the id. This drives me completely insane. Unless you do something like Netflix's Falcor where arrays are represented as objects, there's no getting around it unless a different flavor of patch is used. At which point you're requiring your clients to account for yet another media format.
2. Hints that my representation (aggregate) is two big. Can I break it up? Do I really need a transaction around the whole thing? Can I make separate routes for this? If its not too big, maybe just a few properties, then PUT would work fine.
POST
I just loath partial updates because they force you to write some gnarly code. What does the absence of a property mean; null-out or no change? You need to account for each property in the representation. Can't just whack the whole thing straight into the database ... unless of course that's your design.
PUT
The cleanest imho. Just flip the bit and send the whole thing back. Getting the cancellations is easy without polluting the uri space by using query params - /orders?cancelled=true
I like mca's network-level meanings too.
hope that helps