Consejos y aclaraciones sobre REST API
Conjunto de subrutinas, funciones (o métodos) y procedimientos que ofrece una biblioteca para que otro software los utilice mediante una capa de abstracción
Estilo de arquitectura de software para sistemas distribuidos que describe interfaces de comunicación mediante el protocolo HTTP
La base de comunicación de una API REST son las URL
(consejos a seguir)
vs
Perros y Gatos, no Animales
Limones y Peras, no Frutas
Recurso | GET | POST | PUT | DELETE |
---|---|---|---|---|
/movies | Listar todas las películas | Crear una nueva película | Reemplaza el listado de todas las películas por un nuevo listado | Elimina todas las películas |
/movies/1 | Obtiene los datos de la película 1 | ERROR | Reemplaza la película 1 en caso de existir, en caso contrario ERROR | Elimina la película 1 |
{protocol}://{domain}:[port]/{collection}/api/{version}/{resource}
http://localhost:8080/cinema/api/v1/movies https://localhost:8080/cinema/api/v1/movies/1
usar sustantivos y evitar verbos
(en lo posible)
(wtf?!)
Hypermedia As The Engine Of Application State
{
"movieId": 1,
"name": "Avengers: Infinity War",
"year": "2018",
"links": [
{
"rel": "self",
"url": "http://localhost:8080/cinema/api/v1/movies/1"
},
{
"rel": "cast",
"url": "http://localhost:8080/cinema/api/v1/movies/1/cast"
}
]
}
Ejemplo de un error en formato JSON
{
"status": 204,
"errorCode": 52,
"errorMessage": "No existen películas en el sistema",
"errorData": {
"httpVerb": "PUT",
"requestedUrl": "http://localhost:8080/cinema/api/v1/movies",
"requestedParams": {}
},
"errorTimestamp": "2018-03-30 12:43:30"
}
Es MUY IMPORTANTE proteger las modificaciones de los recursos
Una táctica recomendada es solicitar headers de autenticación en los puntos que exponemos en nuestra API.
Idealmente estos headers debieran tener información encriptada de el usuario que está haciendo la solicitud, para poder filtrar por:
{
"id": 42,
"name": "Robert John Downey Jr.",
"age": 52,
"height": 1.72,
"birthplace": "Manhattan, NY",
"nationality": "USA",
"movies": [...],
"children": [...],
"parents": [...]
}
{
"id": 42,
"name": "Robert John Downey Jr.",
"age": 52
}
/actors/42
/actors/42?id,name,age
[
{"id": 1, ...},
{"id": 2, ...},
{"id": 3, ...},
{"id": 4, ...},
{"id": 5, ...},
{"id": 6, ...},
{"id": 7, ...},
{"id": 8, ...},
{"id": 9, ...},
{"id": 10, ...},
{"id": 11, ...},
{"id": 12, ...},
{"id": 13, ...},
{"id": 14, ...},
...
]
/actors
/actors?limit=10&offset=30
[
{"id": 31, ...},
{"id": 32, ...},
{"id": 33, ...},
{"id": 34, ...},
{"id": 35, ...},
{"id": 36, ...},
{"id": 37, ...},
{"id": 38, ...},
{"id": 39, ...},
{"id": 40, ...}
]
El principio de la documentación es aclarar lo que uno ha hecho a un tercero.
El principio de una API es hacer público lo que uno ha hecho, para que lo usen terceros.
apidocjs: http://apidocjs.com/example/
swagger: http://petstore.swagger.io
Pero esto no ocurrirá hasta por lo menos unos años más. Es una tecnología emergente, mientras que REST API es el estándar usado en la industria actualmente
De todas formas, si saben GraphQL esto sumará valor a su curriculum