- GET: No altera los datos en el servidor, solo puedes obtener datos de el
- POST: Crea datos en el server
- PUT: Altera datos en el server
- DELETE: Lo borra de forma permanente
También puedes usar POST para hacer llamadas a métodos asÃncronos, estos son aquellos que deben de realizar alguna operación que va a requerir más de un tiempo razonable de respuesta ( 100ms en el server ). Si usas POST no deberÃas de agregar variables GET en la URL.
#Validos
- GET 200, 204 ( Respues sin body, serÃa una respuesta apropiada para un llamada a un método asÃncrono )
- POST 201( Creado ), 206( aceptada, tb es válido para lo métodos asÃncronos )
- PUT 204
- DELETE 204
#Inválidos
No te compliques 404 en cualquier caso, asà tb evitas problemas de seguridad, y no das pistas de más a nadie. Si quieres en desarrollo, puedes usar otros métodos. Pero en producción mejor devolver un 404 siempre.
Cuando diseñas la API debes tratar de identificar los siguientes elementos en tu dominio del problema:
-
Documento: Es un concepto único e instanciable. Tal vez un registro en un base de datos y el resultado de una serie de joins en tu bbdd, pero al final debe ser tratada como una unidad atómica de información
-
Colección: Esta claro un grupo de Documentos. Estos son proporcionados por la base de datos y existen fÃsicamente en el servidor.
-
Store: También se usa para aglutinar un conjunto de modelos. PERO estos no forman parte del servidor. Quiero decir que es el usuario de la API quien se encarga de crear o eliminar elementos de esta "collection", Por ejemplo, lo jugadores de un equipo de futbol sin un colección del documento jugador, pero aquellos que para ti son los mejores son un "store" del documento jugador. Espero que más o menos me haya explicado.
-
Controladores: No están relacionados con la información que maneja la api sino con alguna operación que puedas hacer sobre ella. Los controladores pueden ser SÃncronos o AsÃncronos.
- El fragmento de la URI que se refiera a un documento debe ser en singular
- El fragmento de la URI que ser refiera a una colección o a un store, debe ser en plural
- El fragmento de la URI que se refiera a un controlador deber ser un verbo, pero evitar palabras como get, post, ... please!. Recuerda dios mata a un gatito cada vez que alguien pone /get-players en una api restfull
- Usa mejor - en lugar de _ en las URIs
Trata de poner al menos las siguientes cabeceras en todas tus respuetas:
- Content-Type
- Content-Length
Por temas de caché puedes usar en aquellas respuestas que tengan body:
- Last-Modified
- Etag
La regla de oro es básicamente, proporciona información para que puedas cambiar de estado.
Es decir, Trata de introducir en todas tus respuesta un link al siguiente estado al que puede pasar la API una vez llegado a ese punto.
Por ejemplo, si estas repondiendo a un método POST con el que has creado un jugador en tu equipo de futbol, podrÃas en la respuesta poner las URI necesarias para:
- Ver los detalles del jugador recién creados
- Eliminar el jugador recién creado
Yo personalmente como mÃnimo en todas las repuestas a un POST siempre uso la cabecera Location con la URI donde debes de hacer un GET para obtener todos los detalles del jugador.
Esto es tan simple como, crearte un diagrama con cada uno de tus "documentos" y ver segun en que estados estas a que otros estados puedes ir, y luego aportar esa información en la respuesta de la API.
Aquà hay mucha discusión cada libro casi dice una cosa distinta, yo estoy colocando la version de la API como el root de todas las URI:
http://api.mipage.com/v1/my/resource
Pero ahora me doy cuenta que ha sido un error muy gordo.
La próxima vez que haga una API, colocaré la versión en la cabecera de TODAS las respuestas:
x-version 1
Para mà es la mejor solución.
Acuerdate de seguir el standart x-loquesa cuando quieras poner cabeceras própias.
Oauth 2, y te quitas de problemas. Te recomiendo el libro Getting Started with OAuth 2.0, 80 páginas de nada está SUPER bien explicado te lo lees en una tarde y te enteras de todo!!! ... aquà me dà cuenta que una cosa es el diseño de la API y otra muy distinta la seguridad!
Espero que te ayude todo esto!
¿Qué te ha hecho darte cuenta de que ha sido un error muy gordo usar la versión en la URI?