REST - Verbos HTTP
Vamos apresentar neste artigo os principais verbos HTTP usados em APIs REST como funcionam e suas características. |
Uma API REST (também conhecida como API RESTful) é uma interface de programação de aplicativos (API ou API Web) que está em conformidade com as restrições do estilo de arquitetura REST e permite a interação com serviços Web RESTful.
O termo REST significa REpresentational State Transfer ou Transferência de Estado Representacional e foi criado pelo cientista da computação Roy Fielding.
Uma API REST pode ser usada por vários clientes para se comunicar com um servidor sendo um tipo de serviço web que armazena e recupera os dados necessários; para acessar os endpoints de uma API REST usamos os verbos HTTP.
Assim quando planejamos a criação de uma API REST devemos definir quais os endpoints deverão ser criados para acessar os recursos e para ações específicas.
Como exemplo suponha que vamos criar uma API REST para gerenciar recursos que serão definidos como informações sobre carros, e, que desejamos realizar ações como obter uma lista dos carros, obter um carro de forma única, criar um novo carro, alterar os dados existentes para um carro, alterar uma informações específica de carro e excluir um carro existente.
Podemos de forma bem simples representar a definição dos endpoints , dos verbos HTTP usados e das ações desejadas nesta API usando a seguinte tabela:
Endpoint | Verbo HTTP/Método | Ação Esperada | Retorno esperado (Status Code) |
/carros | GET | Retorna uma lista de carros | 200 OK |
/carros | POST | Inclui um novo carro | 201 Created |
/carros/{id} | GET | Retorna um carro pelo seu id | 200 OK |
/carros/{id} | PUT | Substitui dados do carro pelo id | 200 OK ou 204 No Content |
/carros/{id} | PATCH | Altera informações específicas de um carro pelo id | 200 OK ou 204 No Content |
/carros/{id} | DELETE | Remove um carro pelo id | 200 OK |
Nota: Os Status Code retornados quando a operação falha podem ser:
Para obter uma lista dos Código de Status HTTP consulte aqui.
Além dos verbos usados existem ainda os verbos HTTP : HEAD e OPTIONS.
Características de cada verbo HTTP
1- POST
O verbo
POST é
usado com mais frequência para **criar** novos recursos. Em particular, é
usado para criar recursos subordinados. Ou seja, subordinado a algum outro
recurso (por exemplo, pai). Em outras palavras, ao criar um novo recurso, POST
para o pai e o serviço se encarrega de associar o novo recurso ao pai, atribuir
um ID (novo URI de recurso), etc.
Na criação bem-sucedida, retorna o status HTTP 201,
retornando um cabeçalho Location com um link para o
recurso recém-criado com o status HTTP 201.
POST não é seguro pois alterar o estado do recurso
no servidor, nem idempotente, e portanto, é
recomendado para solicitações de recursos não idempotentes. Fazer duas
solicitações POST idênticas provavelmente resultará em dois recursos contendo as
mesmas informações.
2- GET
O método
HTTP GET é
usado para **ler** (ou recuperar) uma representação de um recurso. No
caminho feliz (ou sem erro), GET retorna uma representação em XML ou JSON e um
código de resposta HTTP de 200 (OK). Em um caso de erro, na maioria das vezes
ele retorna um 404 (Not Found) ou 400 (Bad Request).
De acordo com o design da especificação HTTP, as solicitações GET (e HEAD)
são usadas apenas para ler dados e não alterá-los. Portanto, quando usados dessa
forma, são considerados seguros. Ou seja, eles podem ser chamados sem risco de
modificação ou corrupção de dados - chamá-los uma vez tem o mesmo efeito que
chamá-los 10 vezes, ou nenhum. Além disso, GET (e HEAD) é idempotente, o
que significa que fazer várias requisições idênticas acaba tendo o mesmo
resultado de uma única requisição.
Não exponha operações inseguras via GET — ele nunca deve modificar nenhum
recurso no servidor.
3- PUT
PUT é usado com mais
frequência para recursos de **atualização**, enviado para uma URI
de um recurso conhecido com o corpo da solicitação contendo a representação
recém-atualizada do recurso original. Assim PUT exige o envio completo do
recurso.
No entanto, PUT também pode ser usado para criar um recurso no caso em que o
ID do recurso é escolhido pelo cliente em vez do servidor. Ou seja, se o PUT
for para uma URI que contenha o valor de um ID de recurso inexistente.
Novamente, o corpo da solicitação contém uma representação de recurso. Muitos
acham que isso é complicado e confuso. Por isso, este método de criação usando
PUT deve ser usado com moderação, se for o caso.
Na atualização bem-sucedida, retorna 200 (ou 204 se não estiver retornando
nenhum conteúdo no corpo). Se estiver usando PUT para criar, retorne o
status HTTP 201 na criação bem-sucedida. Um corpo na resposta é opcional e
não é necessário retornar um link por meio de um cabeçalho
Location no caso de criação, pois o cliente já definiu o ID do recurso.
PUT não é uma operação segura, pois modifica (ou cria) o estado no
servidor, mas é idempotente. Ou seja, se você criar ou atualizar um
recurso usando PUT e fizer a mesma chamada novamente, o recurso ainda estará lá
e ainda terá o mesmo estado da primeira chamada.
Se, por exemplo, chamar PUT em um recurso que incrementa um contador dentro do
recurso, a chamada não é mais idempotente. Às vezes isso acontece e pode ser
suficiente para documentar que a chamada não é idempotente. No entanto, é
recomendável manter as solicitações PUT idempotentes.
4- PATCH
PATCH é usado para
**modificar** recursos. A solicitação PATCH só precisa conter as alterações
no recurso, não o recurso completo.
Isso se assemelha a PUT, mas o corpo contém um conjunto de instruções que
descrevem como um recurso que reside atualmente no servidor deve ser modificado
para produzir uma nova versão. Isso significa que o corpo do PATCH não deve ser
apenas uma parte modificada do recurso, mas em algum tipo de linguagem de patch
como JSON Patch ou XML Patch.
PATCH não é seguro nem idempotente. No entanto, uma solicitação PATCH pode ser
emitida de forma idempotente, o que também ajuda a evitar resultados ruins de
colisões entre duas solicitações PATCH no mesmo recurso em um período de tempo
semelhante.
As colisões de várias solicitações PATCH podem ser mais perigosas do que as colisões PUT porque alguns formatos de patch precisam operar a partir de um ponto base conhecido ou corromperão o recurso. Os clientes que usam esse tipo de aplicativo de patch devem usar uma solicitação condicional de modo que a solicitação falhe se o recurso tiver sido atualizado desde a última vez que o cliente acessou o recurso.
5- DELETE
O
DELETE é usado para
**excluir** um recurso identificado por um URI.
Na exclusão bem-sucedida, retorna o status HTTP 200 (OK) junto com um corpo de
resposta, talvez a representação do item excluído ou uma resposta agrupada, ou
retornar o status HTTP 204 (SEM CONTEÚDO) sem corpo de resposta.
Em termos de especificação HTTP, as operações DELETE são idempotentes. Se
você EXCLUIR um recurso, ele será removido. Chamar repetidamente DELETE nesse
recurso acaba da mesma forma: o recurso se foi. Se chamar DELETE digamos,
decrementa um contador (dentro do recurso), a chamada DELETE não é mais
idempotente.
Há uma ressalva sobre a idempotência DELETE, no entanto. Chamar DELETE em um
recurso uma segunda vez geralmente retornará um 404 (NOT FOUND), pois ele já foi
removido e, portanto, não é mais localizável. Isso, segundo algumas opiniões,
faz com que as operações DELETE não sejam mais idempotentes, no entanto, o
estado final do recurso é o mesmo. Retornar um 404 é aceitável e comunica com
precisão o status da chamada.
Métodos HEAD e OPTIONS
Embora sejam pouco usados vejamos como atuam estes dois verbos HTTP.
- HEAD
O método HEAD retorna informações sobre o recurso (version/length/type)
O método HEAD é idêntico ao GET, exceto que o servidor NÃO DEVE retornar um corpo de mensagem na resposta. A metainformação contida nos cabeçalhos HTTP em resposta a um pedido HEAD DEVE ser idêntica à informação enviada em resposta a um pedido GET.
Este método pode ser usado para obter metainformações sobre a entidade implícita na solicitação sem transferir a própria entidade-corpo. Esse método é frequentemente usado para testar links de hipertexto quanto à validade, acessibilidade e modificação recente.
Exemplo de response para HEAD:
HTTP/1.1
200 OK |
- OPTIONS
O método OPTIONS representa uma solicitação de informações sobre as opções de comunicação disponíveis na cadeia de solicitação/resposta identificada pelo Request-URI. (Informa quais métodos são permitidos pelo recurso.)
Este método
permite que o cliente determine as opções e/ou requisitos associados a um
recurso, ou os recursos de um servidor, sem implicar em uma ação de recurso ou
iniciar uma recuperação de recurso.
As respostas a esse método não podem ser armazenadas em cache.
Exemplo de response para OPTIONS:
HTTP/1.1
200 OK |
E estamos conversados...
"A ti, ó Deus,
glorificamos, a ti damos louvor, pois o teu nome está perto, as tuas maravilhas
o declaram"
Salmos 76:1
Referências:
C# 9.0 - Instruções de nível superior
ASP.NET Core Web API - Apresentando API Analyzers
ASP.NET Core - Usando o token JWT com o Swagger
Gerando a documentação da Web API com Swagger
.NET - Padrão Repository e Unit of Work com EF 6 (revisitado)