Lembre-se de que, com uma API REST, é tudo uma questão de seu ponto de vista.
Os dois conceitos principais em uma API REST são os terminais e os recursos (entidades). Em termos gerais, um ponto de extremidade retorna recursos via GET ou aceita recursos via POST e PUT e assim por diante (ou uma combinação dos itens acima).
É aceito que, com o POST, os dados que você envia podem ou não resultar na criação de um novo recurso e nos pontos de extremidade associados, que provavelmente não "viverão" sob o URL do POST. Em outras palavras, quando você POST envia os dados para algum lugar para manipulação. O terminal POST não é onde o recurso normalmente pode ser encontrado.
Citação da RFC 2616 (com partes irrelevantes omitidas e partes relevantes destacadas):
9.5 POST
O método POST é usado para solicitar que o servidor de origem aceite a entidade incluída na solicitação como um novo subordinado do recurso identificado pelo Request-URI na linha de solicitação. O POST foi projetado para permitir um método uniforme para cobrir as seguintes funções:
- ...
- Fornecer um bloco de dados, como o resultado do envio de um formulário, para um processo de manipulação de dados;
- ...
...
A ação executada pelo método POST pode não resultar em um recurso que pode ser identificado por um URI . Nesse caso, 200 (OK) ou 204 (Sem conteúdo) é o status de resposta apropriado, dependendo de a resposta incluir ou não uma entidade que descreve o resultado .
Se um recurso foi criado no servidor de origem, a resposta DEVE ser 201 (Criado) ...
Nós nos acostumamos a pontos finais e recursos que representam 'coisas' ou 'dados', seja um usuário, uma mensagem, um livro - qualquer que seja o domínio do problema. No entanto, um terminal também pode expor um recurso diferente - por exemplo, resultados da pesquisa.
Considere o seguinte exemplo:
GET /books?author=AUTHOR
POST /books
PUT /books/ID
DELETE /books/ID
Este é um REST CRUD típico. No entanto, o que se adicionamos:
POST /books/search
{
"keywords": "...",
"yearRange": {"from": 1945, "to": 2003},
"genre": "..."
}
Não há nada de RESTful nesse terminal. Ele aceita dados (entidade) na forma do corpo da solicitação. Esses dados são os Critérios de pesquisa - um DTO como qualquer outro. Este terminal produz um recurso (entidade) em resposta à solicitação: Resultados da Pesquisa . O recurso de resultados da pesquisa é temporário, servido imediatamente ao cliente, sem redirecionamento e sem ser exposto a outros URLs canônicos.
Ainda é REST, exceto que as entidades não são livros - a entidade de solicitação é um critério de pesquisa de livros e a entidade de resposta é um resultado de pesquisa de livros.