Melhores práticas no design de APIs Rest
URI
- Substantivos: Use substantivos nas URIs para identificar claramente os recursos. Evite verbos, pois as URIs devem representar recursos e não ações. Por exemplo, em vez de /getUser use /users.
- Plural: Utilize o plural para nomear os recursos nas URIs, mesmo que o recurso possa ser único em determinadas operações. Isso torna a nomenclatura consistente e intuitiva. Por exemplo, /users em vez de /user.
- Recursos aninhados: Utilize a aninhamento de recursos (nested resources) para representar a hierarquia e a relação entre recursos. Isso ajuda a organizar e a clarificar a estrutura da API. Por exemplo, para acessar os pedidos de um usuário específico, utilize /users/{userId}/orders em vez de algo como /orders?userId={userId};
- Consistência: Mantenha consistência na estrutura e no estilo das URIs em toda a API. Isso inclui o uso consistente de maiúsculas/minúsculas, hifens, barras e pluralidade. Isso melhora a previsibilidade e a compreensão da API. Por exemplo, se você começar com /users, continue usando essa estrutura para outros recursos, como /products e /categories;
- Versioning: Inclua a versão da API na URI para permitir atualizações e mudanças sem quebrar a compatibilidade com versões anteriores. Isso pode ser feito utilizando um prefixo como /v1, /v2, etc. Por exemplo, /v1/users permite identificar claramente que está utilizando a versão 1 da API.
Métodos HTTP
-
GET:
-
Conjunto de recursos: Ao obter uma coleção de recursos, você pode aplicar paginação, filtragem e ordenação para controlar o volume e a organização dos dados retornados.
-
Único recurso: Solicita um único recurso específico por ID ou identificador único.
-
Request:
- Headers: Pode incluir cabeçalhos para controle de cache, como
If-None-Match
ouIf-Modified-Since
. - Body: Não possui corpo na solicitação GET.
- Headers: Pode incluir cabeçalhos para controle de cache, como
-
Response:
- Headers: Pode incluir cabeçalhos para controle de cache, como
ETag
ouLast-Modified
. - Status code:
200 OK
: Quando a solicitação é bem-sucedida e os dados são retornados.304 Not Modified
: Quando o recurso não foi modificado desde a última solicitação, com base nos cabeçalhos de cache.
- Headers: Pode incluir cabeçalhos para controle de cache, como
-
-
POST: Utilizado para criar um novo recurso em uma coleção. A URI alvo geralmente representa a coleção, e o novo recurso é adicionado a esta coleção. Pode ser usado para iniciar uma ação ou processamento específico em um recurso existente.
-
Request:
- Headers: Pode incluir cabeçalhos como
Content-Type
para indicar o formato dos dados enviados. - Body: Inclui o corpo da solicitação com os dados do novo recurso a ser criado ou os parâmetros necessários para a ação a ser iniciada.
- Headers: Pode incluir cabeçalhos como
-
Response:
- Headers: Pode incluir o cabeçalho
Location
indicando a URI do novo recurso criado. - Status code:
201 Created
: Quando um novo recurso é criado com sucesso.202 Accepted
: Quando a solicitação foi aceita para processamento, mas o processamento não foi concluído. Isso é útil para operações assíncronas, onde o cliente não precisa esperar a conclusão do processamento.
- Headers: Pode incluir o cabeçalho
-
-
PUT: O método PUT é utilizado para criar ou atualizar um recurso específico.
- Request:
- Headers: Pode incluir cabeçalhos como
If-Match
para controle de versões do recurso. - Body: Deve incluir o recurso completo a ser criado ou atualizado.
- Headers: Pode incluir cabeçalhos como
- Response:
- Headers: Pode incluir o cabeçalho
Location
indicando a URI do recurso criado ou atualizado. - Status code:
201 Created
: Quando um novo recurso é criado com sucesso.200 OK
: Quando um recurso existente é atualizado com sucesso.204 No Content
: Quando um recurso existente é atualizado com sucesso e não há conteúdo adicional para retornar.404 Not Found
: Quando o recurso a ser atualizado não é encontrado.412 Precondition Failed
: Quando a condição especificada nos cabeçalhos, comoIf-Match
, falha.
- Headers: Pode incluir o cabeçalho
- Request:
-
DELETE:
-
Request:
- Headers: Pode incluir cabeçalhos como
If-Match
para controle de versões do recurso. - Body: Não possui corpo na solicitação DELETE.
- Headers: Pode incluir cabeçalhos como
-
Response:
- Headers: Nenhum cabeçalho específico necessário.
- Status code:
204 No Content
: Quando o recurso é removido com sucesso.412 Precondition Failed
: Quando a condição especificada nos cabeçalhos, comoIf-Match
, falha.
-
Idempontência
Idempontência refere-se a uma propriedade dos métodos HTTP que garante que realizar a mesma operação múltiplas vezes tenha o mesmo efeito que realizá-la apenas uma vez. Isso é importante para garantir a consistência e previsibilidade das operações na API.
- GET: Idempotente. Repetir a solicitação não altera o estado do recurso.
- PUT: Idempotente. Repetir a solicitação com os mesmos dados resulta no mesmo estado do recurso.
- DELETE: Idempotente. Repetir a solicitação para um recurso já deletado não altera o estado (continua deletado).
- POST: Não idempotente. Repetir a solicitação pode resultar na criação de novos recursos duplicados.
Gerenciamento de Erros
- 4xx: Erros do Cliente - Ocorrências que indicam que o cliente fez uma solicitação inválida ou incorreta.
- 5xx: Erros do Servidor - Problemas que surgem devido a falhas no servidor ao processar uma solicitação válida.
Interessante comentar que no PUT vc precisa passar todos os dados, se quiser alterar somente alguns dados, sem precisar reenviar todos vale usar o PATCH
Ótimo texto, coisas interessantes para observar e lembrar
No endpoint GET users/
quando nao tem usuários, o correto seria 404 ou 200 com json vazio.