I've read quite a few articles on the difference between POST and PUT and in when the two should be used. But there are still few things confusing me ( hopefully questions will make some sense ):
1) We should use PUT to create resources when we want clients to specify the URI of the newly created resources and we should use POST to create resources when we let service generate the URI of the newly created resources.
a) Is it just by convention that POST create request doesn't contain an URI of the newly created resource or POST create request actually can't contain the URI of the newly created resource?
b) PUT has idempotent semantics and thus can be safely used for absolute updates ( ie we send entire state of the resource to the server ), but not also for relative updates ( ie we send just changes to the resource state ), since that would violate its semantics.
But I assume it's still possible for PUT to send relative updates to the server, it's just that in that case the PUT update won't be idempotent?
2) I've read somewhere that we should "use POST to append a resource to a collection identified by a service-generated URI".
a) What exactly does that mean? That if URIs for the resources were generated by a server ( thus the resources were created via POST ), then ALL subsequent resources should also be created via POST? Thus, in such situation no resource should be created via PUT?
b) If my assumption under a) is correct, could you elaborate why we shouldn't create some resources via POST and some via PUT ( assuming server already contains a collection of resources created via POST )?
REPLY:
1) Please correct me if I'm wrong, but from your post and from the link you've posted, it seems:
a) The Request-URI in POST is interpreted by server as the URI of the service. Thus, it could just as easily be interpreted as an URI of a newly created resource, if server code was written to recognize Request-URI as such
b) Similarly, PUT is able to send relative updates, it's just that service code is usually written such that it will complain if PUT updates are relative.
2)
Usually, create has fallen into the POST camp, because of the idea of
"appending to a collection." It's become the way to append a resource
to a list of resources.
I don't quite understand the reasoning behind the idea of "appending to a collection" and why this idea prefers POST for create.
Namely, if we create 10 resources via PUT, then server will contain a collection of 10 resources and if we then create another resource, then server will append this resource to that collection ( which will now contain 11 resources )?! Uh, this is kinda confusing
thank you