# Carpeta API

En una Rest Based Api (api basada en rest), la comunicación se realiza mediante diferentes tipos de request sobre una misma ruta.

Por ejemplo para la ruta `/products` tendremos los siguientes métodos.

* GET : muestra los detalles del producto.
* POST : crea un nuevo producto.
* PUT : borra el producto y crea uno nuevo en su lugar.
* DELETE : borra el product.

Es decir, solo cambiando el método del request podemos indicarle a express que realice diferentes operaciones asociadas con un elemento del modelo de negocios de nuestro sistema (en este caso products).

### Hello World Api

Para nuestro proyecto vamos a seguir la siguiente convección para crear nuestras rutas de la API `api/<your_api_endpoint>` por ejemplo `api/products` o `api/users`. En esta carpeta es común tener los archivos para modelos, servicios, eventos, controladores, etc.

Crearemos nuestro primer controlador llamado `helloWorld.controller.js` los **controladores** serán los encargados de administrar la interacción de la base de datos con la API, tendrá la responsabilidad de consultar, eliminar y crear los datos de nuestra aplicación.

En la sesión de sobre Mongoose abordaremos más de este tema.

Nuestro primer controlador tendrá el siguiente código:

{% tabs %}
{% tab title="api/helloworld/helloWorld.controller.js" %}
```javascript
/**
 * @author: Cristian Moreno Zuluaga <khriztianmoreno@gmail.com>
 */

/**
 * Show hello world
 */
function index(req, res) {
  return res.status(200).json({ message: 'hello wolrd!!' });
}

module.exports = { index };
```
{% endtab %}

{% tab title="" %}
```
```
{% endtab %}
{% endtabs %}

La función index recibe dos parametros request y response.

### Express Requests

El objeto request tiene mas propiedades que la petición del http request del cual exitende. Estas propiedades simplifican el desarrollo y proveen funcionalidad adicional.

* **request.params** : parametros del url.
* **request.query** : parametros del query string.
* **request.route** : ruta actual como string.
* **request.cookies** : cookies (requiere de cookie parser).
* **request.signedCookies** : cookies firmadas (requiere de cookie parser).
* **request.body** : contenido del cuerpo de la petición (requiere de cookie parser).
* **request.headers** : cabeceras de la petición.

Atajos para el manejo de las cabeceras `request.headers`.

* request.get(headerKey) : valor de la cabecera de la cual se especifica su llave.
* request.accepts(type) : verifica si el tipo es valido.
* request.acceptsLanguage(language) : verifica el lenguaje.
* request.appcetsCharset(charset) : verifica el charset.
* request.is(type) : verifica el tipo.
* request.ip : dirección ip.
* request.ips : direcciones ip (cuando se habilita uso del proxy).
* request.path : path del url.
* request.host : host.
* request.fresh : verifica la rescura.
* request.stale : verifica el estancamiento.
* request.xhr : verdadero para los ajax requests.
* request.protocol : retorna el protocolo HTTP.
* request.secure : verifica si el protocolo es https.
* request.subdomains : arreglo de subdominios.
* request.originalUrl : dirección url original.

### Express Responses

El response puede ser utilizado y modificado antes de ser enviado de regreso.

#### Métodos del response. <a href="#metodos-del-response" id="metodos-del-response"></a>

El objeto response tiene métodos adicionales a `statusCode(), writeHead(), end() y write()`.

* **response.redirect(url)** : redireccionar la respuesta.
* **response.send(data)** : envía la respuesta.
* **response.json(data**) : envia un json de regreso y agrega las cabeceras apropiadas.
* **response.sendfile(path, options, callback)** : envía un archivo para descarga.
* **response.render(template, locals, callback**) : procesa un template.
* **response.locals** : envia datos al template.

#### HTTP Status Codes. <a href="#http-status-codes" id="http-status-codes"></a>

Para especificar un código de estatus, utilice la función de respuesta `response.status(400)`.

* 2## : para respuestas de procesos satisfactorios.
* 3## : para redirecciones o información del cache.
* 4## : para errores del lado del cliente.
* 5## : para errores del lado del servidor.

Tome en cuenta que para los errores 3##, el cliente debe realizar una operación adicional para completar la petición.

Algunas respuestas como la 204 no soportan ningún tipo de mensaje dentro del cuerpo de la respuesta.

```
res.status(203).end();
```

#### Commit: [Add the helloworld controller](https://github.com/khriztianmoreno/workshop-js-dev-bk/commit/6617d20539dbbf3468239ecd2df9fefc09f60ee9)
