Eu sou um desenvolvedor e na maior parte da minha carreira tenho criado APIs para vários serviços. As diretrizes para este artigo foram compiladas com base nos problemas mais comuns ao projetar seu próprio serviço como uma equipe ou usar APIs de terceiros.
Provavelmente, você encontrou provedores de API terríveis. Trabalhar com eles, via de regra, está associado ao aumento da emocionalidade e da incompreensão. A maioria desses problemas pode ser evitada projetando a interface do aplicativo usando as dicas abaixo.
1. Não use verbos no URL *
* - se esta for uma das operações CRUD.
Os métodos de solicitação CRUD são responsáveis pela ação com o recurso: POST - criar (criar), GET - obter (ler), PUT / PATH - atualizar (atualizar), DELETE - excluir (você entende). Ruim:
POST /users/{userId}/delete -
POST /bookings/{bookingId}/update -
OK:
DELETE /users/{userId}
PUT /bookings/{bookingId}
2. Use verbos no URL
Ruim:
POST /users/{userId}/books/{bookId}/create -
OK:
POST /users/{userId}/books/{bookId}/attach
POST /users/{userId}/notifications/send -
3. Destacar novas entidades
Acima há um exemplo de como adicionar um livro a um usuário, talvez a lógica de seu aplicativo implique em uma lista de favoritos, então o caminho pode ser assim:
POST /wishlist/{userId}/{bookId}
4. Use um ID de recurso *
* - se sua estrutura de dados permitir.
Isso significa que se você tiver registros um-para-muitos, por exemplo,
reserva -> viajantes (reserva-> viajantes), será suficiente que você passe o ID do viajante na solicitação.
Ruim:
#
GET /bookings/{bookingId}/travellers/{travellerId}
OK:
GET /bookings/travellers/{travellerId}
Também observo que /bookings/travellers/
é melhor do que apenas /travellers
se ater bem à hierarquia de dados em sua API.
5.
:
GET /user/{userId} -
POST /ticket/{ticketId}/book -
:
GET /users/{userId}
POST /tickets/{ticketId}/book
6. HTTP-
- . . :
400 Bad Request - , , .
401 Unauthorized - .
403 Forbidden - , .
404 Not Found - .
409 Conflict - , .
500 Internal Server Error - .
503 Service Unavailable - .
7.
. , - (quizzes passed_quizzes). , .
: /quizzes
/quizzes/passed
. quizzes
- (), passed
- ().
:
GET /passed-quizzes -
GET /booked-tickets -
POST /gold-users -
:
GET /tickets/booked
POST /users/gold
8.
API - . , , .
:
GET /book/{bookId}
{
"name": "Harry Potter and the Philosopher's Stone",
"genre": "fantasy",
"status": 0, #
"error": false,
...
}
:
GET /book/{bookId}
{
"status": 0,
"message": "ok",
"data": {...}
}
3 . status
, message
- , , . , , . 409 status
message
.
9. json camelCase
9.1 Em parâmetros de consulta
ruins:
GET /users/{user-id}
GET /users/{user_id}
GET /users/{userid}
OK:
GET /users/{userId}
POST /ticket/{ticketId}/gold
9.2 No corpo da resposta ou solicitação recebida
Ruim:
{
"ID": "fb6ad842-bd8d-47dd-b7e1-68891d8abeec",
"Name": "soccer3000",
"provider_id": 1455,
"Created_At": "25.05.2020"
}
OK:
{
"id": "fb6ad842-bd8d-47dd-b7e1-68891d8abeec",
"Name": "soccer3000",
"providerId": 1455,
"createdAt": "25.05.2020"
}
10. Use Content-Type
Ruim:
GET /tickets.json
GET /tickets.xml
OK:
GET /tickets
//
ontent-Type: application/json
//
ontent-Type: application/xml
Conclusão
As recomendações listadas acima não são a lista completa de maneiras de tornar a API melhor. Para um estudo mais aprofundado, recomendo que você analise as especificações da API REST e a lista de códigos de status http (você ficará surpreso com quantos existem e quais situações eles abrangem).
E nos comentários, sugiro escrever sua própria recomendação para construir uma API REST que você considera importante.