![](https://i.imgur.com/ld6aL74.png =200x) # JSON Server ## Introducción Aprendimos cómo realizar solicitudes a las API web, pero hay veces que para empezar a trabajar en nuestro Front-end necesitamos esperar a que el equipo del Back-end termina la API REST. [JSON Server](https://github.com/typicode/json-server) es un **módulo NPM** muy útil, de código abierto y publicado bajo la licencia MIT, que permite a los desarrolladores crear prototipos de su Back-end realmente rápido, creando una API REST falsa a partir de un archivo JSON simple. De esta manera, cuando necesites conectarte al Back End real del proyecto, solo necesitas cambiar la URL a la que apuntan las solicitudes. ## Instalar Primero, necesitamos instalar el paquete. Lo haremos a nivel global para que podamos ejecutarlo desde cualquier lugar en nuestras computadoras. Ejecutamos el siguiente código en la terminal: ```bash $ npm install -g json-server ``` ## Creando los Recursos Creemos una carpeta **my-fake-api** para empezar a trabajar. Dentro de la carpeta necesitamos crear un archivo `JSON`, donde pondremos toda la información, creamos un archivo **`db.json`**. ```javascript my-fake-api/ ├── db.json ``` Abrimos el archivo `db.json` en el editor y pegamos el siguiente código: ```javascript { "cities":[ { "id":1, "name":"Barcelona" }, { "id":2, "name":"Madrid" }, { "id":3, "name":"Miami" }, { "id":4, "name":"Paris" } ], "courses":[ { "id":1, "name":"WebDev", "type":"Full Time" }, { "id":2, "name":"WebDev", "type":"Part Time" }, { "id":3, "name":"UX/UI", "type":"Full Time" }, { "id":4, "name":"UX/UI", "type":"Part Time" } ], "bootcamps":[ { "id":1, "cityId":1, "courseId":1 }, { "id":2, "cityId":2, "courseId":2 }, { "id":3, "cityId":3, "courseId":1 }, { "id":4, "cityId":4, "courseId":2 }, { "id":5, "cityId":2, "courseId":3 }, { "id":6, "cityId":3, "courseId":4 }, { "id":7, "cityId":1, "courseId":3 } ] } ``` Vayamos a la terminal y dentro de **my-fake-api**, ejecutamos el siguiente código: ```bash $ json-server --watch db.json --port 8000 ``` **:eyes: Observamos que estamos especificando el `puerto` donde queremos ejecutar nuestra API falsa. De forma predeterminada, se ejecutará en el **puerto 3000**, por lo que si queremos ejecutar al mismo tiempo nuestra aplicación Express, no podremos hacerlo.** Si todo salió bien, debería ver algo como esto en la terminal: ![](https://s3-eu-west-1.amazonaws.com/ih-materials/uploads/upload_6938360ac89c9a923efcc1c188c91330.png) Ahora estamos listos para comenzar a hacer solicitudes a nuestra nueva API, así que continúe y ejecute una solicitud GET de Postman, debería ver todos los datos que acabamos de pegar en el archivo `db.json`. ```bash GET http://localhost:8000/cities ``` ![](https://s3-eu-west-1.amazonaws.com/ih-materials/uploads/upload_636d0d042c2117d02545e426c2cd3047.png) ## Rutas **JSON-Server** obtiene las claves que especificamos en el archivo `.json`, y crea una ruta para cada una de ellas *(como si fueran colecciones en nuestra base de datos)*, por lo que en nuestro caso tendremos lo siguiente rutas: - `/cities` - `/courses` - `/bootcamps` ### GET Requests Parameters Hicimos una solicitud GET a la ruta `/cities`, pero eso es solo el comienzo. **JSON-server** nos permite hacer algunas solicitudes GET específicas agregando parámetros: - **Id específico**. Especificar el **id** después de que la colección, para que recupere **solo** la ciudad especificada. ```javascript GET /cities/1 ``` - **Filtrar**. En nuestro ejemplo, recupera todas las ciudades que tienen una propiedad `name` con el valor **Barcelona** ```javascript GET /cities?name=Barcelona ``` - **Paginar**. Utilice _page y, opcionalmente, _limit para paginar los datos devueltos. ```javascript GET /cities?_page=1 GET /bootcamps?_page=7&_limit=20 //10 items are returned by default //In the Link header, you'll get first, prev, next and last links. ``` **La paginación es una forma en que podemos dividir un documento en porciones más pequeñas.** - **Ordenar**. Agregamos _sort y _order (orden ascendente por defecto) ```javascript GET /cities?_sort=name&_order=asc ``` ## Solicitudes POST, PUT, PATCH y DELETE Somos maestros haciendo solicitudes GET a nuestra nueva API falsa, pero ¿y si necesitamos agregar más datos? ¿O tal vez editar o eliminar algo? ¡Sí! Podemos hacer solicitudes usando otros métodos :wink: **Si realizas solicitudes POST, PUT, PATCH o DELETE, los cambios se guardarán de forma automática y segura en `db.json` usando [lowdb](https://github.com/typicode/lowdb).** ### Método POST Usando JSON-Server es exactamente lo mismo que usar el método POST para agregar nuevos datos a nuestra base de datos. Es importante tener en cuenta que el cuerpo de su solicitud JSON debe incluirse en un objeto, al igual que la salida `GET` Por ejemplo, `{"name":" Berlín "}` Así que imagina que queremos agregar una nueva ciudad a nuestra colección de `cities`, deberíamos hacer algo como esto: ![](https://s3-eu-west-1.amazonaws.com/ih-materials/uploads/upload_e5612c19d04fb0364d53f7d256124d90.png) Usando Postman, podemos enviar los datos como un JSON usando la opción `raw`, o agregarlos a través de `x-www-form-urlenconded` especificando el objeto clave-valor. Como respuesta obtendremos el nuevo elemento recién agregado a nuestra DB :wink: Entonces, si hacemos una solicitud GET a la colección `cities`, deberíamos poder ver **Berlín** en la lista. ![](https://s3-eu-west-1.amazonaws.com/ih-materials/uploads/upload_690a43ec0e1bc876de7aacb20eba37f8.png) ### Método PUT/PATCH Usar el método PUT o PATCH es realmente similar al método POST, pero en la URL debe especificar el **id** del elemento que desea editar. Al igual que en el método POST, el cuerpo de su solicitud JSON debe incluirse en un objeto. ![](https://s3-eu-west-1.amazonaws.com/ih-materials/uploads/upload_4e5484b61c5049ccde8297bffc910f60.png) Si especificas un *id* que no existe, no realizará ningún cambio en el archivo. Los valores de identificación no son mutables. **Se ignorará cualquier valor de identificación en el cuerpo de su solicitud PUT o PATCH. Solo se respetará un valor establecido en una solicitud POST, pero solo si aún no se ha tomado.** ### Método DELETE Por último, pero no menos importante, tenemos los métodos DELETE. Al igual que los métodos PUT y PATCH, debemos especificar el **id** que queremos eliminar de nuestra base de datos. Y eso es todo, ¡eliminamos con éxito un elemento de nuestra base de datos falsa! :wink: ## Recursos extra - [JSON Server](http://github.com/typicode/json-server) - [Node Module of the Week - JSON Server](http://nmotw.in/json-server/)