TL;DR: not that there needs to be a resource for authentication, but it needs authorization for you to manipulate a resource.
The first concept to be understood from REST is the recourse. It is something to be downloaded on the web.
Metaphorically, think of a library. It has many resources: books, people, employees.
GET
It’s very simple to think of REST that way. If I want to know about a book, I can do:
GET api.biblioteca.com/livros/iliada
{
"autor": "Homero",
"título": "Ilíada",
"descrição": "A Ilíada (em grego antigo: Ἰλιάς, IPA: [iːliás]) é um dos dois principais poemas épicos da Grécia Antiga, de autoria atribuída ao poeta Homero, que narra os acontecimentos decorridos no período de 50 dias durante o décimo e último ano da Guerra de Troia, conflito empreendido para a conquista de Ílion ou Troia, cuja gênese radica na ira (μῆνις, mênis) de Aquiles."
}
If I want all of Homer’s books, I’ll make it look like query string:
GET api.biblioteca.com/livros?autor=Homero
[ { ... }, { ...} ]
Or depending on the design of your API, it could also be: api.biblioteca.com/autor/homero/livros
It can be concluded that the HTTP GET method, in REST, is using to return one or more resources.
DELETE
If you need to take a book from the library, just use DELETE.
DELETE api.biblioteca.com/livros/iliada
POST
This method sends data to the server. In REST, we use it to create a new resource.
Because it’s not idempotent, you can’t cache the response to a request like this.
POST api.biblioteca.com/livros
{
"autor": "William Shakespeare",
"título": "Macbeth",
"descrição": "Macbeth é uma tragédia do dramaturgo inglês William Shakespeare, sobre um regicídio e suas consequências. É a tragédia shakespeariana mais curta, e acredita-se que tenha sido escrita entre 1603 e 1607. O primeiro relato de uma performance da peça é de abril de 1611, quando Simon Forman registrou tê-la visto no Globe Theatre, em Londres. A obra foi publicada pela primeira vez no Folio, de 1623, possivelmente a partir de uma transcrição de alguma performance específica."
}
PUT
Like the POST, it is used to send data to the server. In REST, it is used to update unique resources, such as a specific book.
Because it is ideal, the response of the requests can be cached.
PUT api.biblioteca.com/livros/arte-da-guerra
{
"autor": "Sun Tzu",
"título": "Arte da Guerra"
}
PATCH
Like PUT, it is used to send data to the server. In REST, it is used to update partial resources. Such as adding or updating a single field in an entity.
It may or may not be idempotent, so it may be a somewhat confusing method.
PATCH api.biblioteca.com/livros/arte-da-guerra
{
"descrição": "A Arte da Guerra (chinês: 孫子兵法; pinyin: sūn zĭ bīng fǎ, literalmente "Estratégia Militar de Sun Tzu"), é um tratado militar escrito durante o século IV a.C. pelo estrategista conhecido como Sun Tzu. O tratado é composto por treze capítulos, cada qual abordando um aspecto da estratégia de guerra, de modo a compor um panorama de todos os eventos e estratégias que devem ser abordados em um combate racional. Acredita-se que o livro tenha sido usado por diversos estrategistas militares através da história como Napoleão, Zhuge Liang, Cao Cao, Takeda Shingen, Vo Nguyen Giap e Mao Tse Tung."
}
POST vs PUT vs PATCH
There are numerous discussions comparing the two methods and their use. It is important to note that REST is only a standard, and does not solve all cases.
- Use POST to create new features in collection endpoints, such as
api.biblioteca.com/livros
.
- Use PUT to update resources in entity endpoints, such as
api.biblioteca.com/livros/iliada
.
- Use PATCH to partially update resources, also in entity endpoints.
In short...
+-----------------------------+-----+------+-----+-------+--------+
| | GET | POST | PUT | PATCH | DELETE |
+-----------------------------+-----+------+-----+-------+--------+
| Requisição aceita body? | Não | Sim | Sim | Sim | Sim |
| Resposta aceita body? | Sim | Sim | Sim | Sim | Sim |
| Altera estado dos recursos? | Não | Sim | Sim | Sim | Sim |
| É idempotente? | Sim | Não | Sim | Não | Sim |
| É cacheável? | Sim | Não* | Não | Não | Não |
+-----------------------------+-----+------+-----+-------+--------+
* depende do que vier nos headers
Okay, but what about authentication?
As I said, REST does not solve everything, nor should it. Not everything is resource or can be represented as one. There goes from implementation to implementation.
There are several ways to authenticate using HTTP, and the vast majority have nothing to do with the HTTP method, but sessions, cookies or HTTP headers.
The point is: it’s not that there needs to be a resource for authentication, but it needs authorization for you to delete a book, for example.
Basic authentication with HTTP
The golden tip, first, is to be using HTTPS. At each request made, an HTTP header indicating an authentication token.
DELETE api.biblioteca.com/livros/arte-da-guerra
Authorization: Basic QWxhZGRpxjpvcGVuIHNlc2FtZS==
I recommend reading more about this authentication method on MDN.
Quick response: conceptually authentication is not part of the user resource. It would be better for you to separate responsibilities and create your own service, so you can use all the methods needed for authentication.
– Woss
@Andersoncarloswoss did not understand this quick response, can explain better?
– Costamilam