We can thrown five different HTTP requests at the VTEX Master Data: GET, POST, PATCH, PUTCH and DELETE. GET and DELETE are very simple to understand (once for get documents and the other one to delete them), but POST, PATCH and PUT seems like they all do the same thing.
There are small differences between POST, PATCH and PUT that justify the existence of all of them, and knowing this could improve our VTEX implementation and how we interact with the Master Data.
POST, PATCH or PUT?
The first one, POST, allows us to create a new document in a specific Data Entity. If the document already exists we won't be able to introduce the new data into the Data Entity.
For example, if we perform a POST request to create a new client with the email johndoe@example.com and name John, but the Data Entity CL already has a client with that email address a new document won't be created.
It doesn't matter if the existing document with the email johndoe@example.com has a different name for the client. Since the email needs to be unique the request will fail and the other attributes like the name will be discards.
On the other hand, PATCH works just like POST in terms that it will create a new document, but if the document already exists then the attributes from the existing document are updated with the new values that we are sending in the request.
Take into consideration that PATCH, in the scenario where the document already exists, will update only the attributes that we are sending in the request. The attributes that exists on the document but are not mentioned in the request won't be affected.
Finally, PUT works as POST too when the document doesn't exists: it creates a new one with the values we're sending in the request.
When using PUT in an scenario where the document already exists it will cause the existing document in the Data Entity to be completed overwritten. In other words, the existing document will be deleted, a new one will be created with the attributes mentioned in the request, and the ignored attributes in the request will be empty in the final created document.
Let me recap. POST to create a new document, PATCH to create a new document if it doesn't exist or to update the values of the attributes in an existing document, and finally PUT to create a new document if it doesn't exist or to overwrite an existing document.
A friendly example
Given an empty CL Data Entity, we perform a POST to create a new document with the following JSON in the request.
{
email : "johndoe@example.com",
firstName : "John",
lastName : "Doo"
}
Since the document doesn't exist, it will be created.
Then, we decided to change the lastName of the document because we spot a typo on it. For this, we use PATCH and the following JSON in the request.
{
email : "johndoe@example.com",
lastName : "Doe"
}
After the request the document on the Data Entity will look like the following.
{
email : "johndoe@example.com",
firstName : "John",
lastName : "Doe"
}
Finally, the document became obsolete and we need to overwrite it using PUT and the following JSON.
{
email : "johndoe@example.com",
firstName : "Jane"
}
The existing document with that email address will be deleted and a new one will be created, as follow.
{
email : "johndoe@example.com",
firstName : "Jane",
lastName : ""
}
As you saw, lastName is empty.