Sei sulla pagina 1di 4

REST es una serie de convenciones en la interaccin cliente-servidor sobre el protocolo

HTTP. En la prctica, un interfaz REST es un interfaz de programacin de aplicaciones


que usa, para acceder al servidor, el conjunto completo de rdenes del protocolo HTTP y
confa en los mensajes informativos y de error del mismo.
Aunque se trate de un hermano menor de otros tipos de servicios web (que se vern ms
adelante en este curso), su popularidad se debe sobre todo al poco overhead que aade
a las peticiones y a la facilidad de su uso, tanto en el cliente como el servidor. Tambin se
puede implementar directamente sobre servidores web estndar como Apache o nginx , lo
que facilita su implantacin y desarrollo. Crear un cliente para un API REST es tan fcil
como crear una cadena; de hecho, se pueden usar desde la lnea de rdenes
En REST, el nfasis se pone en los recursos, o sustantivos; especialmente en los
nombres que se le asigna a cada tipo de recurso. Por ejemplo, una aplicacin REST
podra definir algunos tipos de recursos asignndoles estos nombres:
Usuario {}
Localizacin {}
Cada recurso tendra su propio identificador. Los clientes trabajaran con estos recursos a
travs de las operaciones estndar de HTTP, como GET para descargar una copia del
recurso. Obsrvese cmo cada objeto tiene su propia URL y puede ser fcilmente
cacheado, copiado y guardado como marcador. POST se utiliza por lo general para
acciones con efectos laterales, como enviar una orden de compra o aadir ciertos datos a
una coleccin.
Por ejemplo, el registro para un usuario podra tener el siguiente aspecto:
<usuario>
<nombre>Mara Juana</nombre>
<sexo>mujer</sexo>
<localizacin href="http://www.example.org/locations/us/ny/new_york_city">Nueva York,
NY, US</localizacin>
</usuario>

Para actualizar la localizacin del usuario, un cliente REST podra primero descargar el
registro XML anterior usando GET. El cliente despus modificara el fichero para cambiar
la localizacin y lo subira al servidor utilizando HTTP PUT.
Ntese, sin embargo, que los verbos HTTP (POST, GET, PUT, DELETE) no proporcionan
ningn mecanismo estndar para descubrir recursos -- no hay ninguna operacin LIST o
FIND en HTTP, que se corresponderan con las operacioneslist*() y find*() en el ejemplo
RPC. En su lugar, las aplicaciones basadas en datos REST resuelven el problema
tratando una coleccin de resultados de bsqueda como otro tipo de recurso, lo que
requiere que los diseadores de la aplicacin conozcan URLs adicionales para mostrar o
buscar cada tipo de recurso.
Por ejemplo, una peticin GET HTTP sobre la
URL http://www.example.org/locations/us/ny/ podra devolver un enlace a una lista de
ficheros en XML con todas las localizaciones posibles en Nueva York, mientras que una
peticin GET a la URL http://www.example.org/users?surname=Michaels podra devolver
una lista de enlaces a todos los usuarios con el apellido "Michaels".
REST proporciona algunas indicaciones sobre cmo realizar este tipo de acciones como
parte de su restriccin "hipermedia como el medio de estado de la aplicacin", lo que
sugiere el uso de un lenguaje de formularios (tales como un formulario HTML) para
especificar consultas parametrizadas.
Pues bien, ahora en un desarrollo basado en API REST tendremos un esquema como el
que puedes ver en esta imagen:

Node.js es una plataforma de ejecucin de JavaScript basada en eventos que sigue un


modelo de I/O no bloqueante. Un servidor HTTP bsico tiene el siguiente aspecto:
1. var http = require('http');
2. http.createServer(function (req, res) {
3. res.writeHead(200, {'Content-Type': 'text/plain'});
4. res.end('Hello World\n');
5. }).listen(1337, '127.0.0.1');

Es una plataforma especialmente adecuada para la construccin de APIs


REST por algunos motivos: JavaScript es perfecto para APIs JSON. El
serializado/deserializado es nativo.
Normalmente las APIs ofrecen peticiones pequeas y de poca necesidad
computacional, el caso de uso perfecto para Node.js, ya que durante un proceso intenso
de cmputo el bucle de eventos no se procesa (cuando se ejecuta en un nico proceso).
NodeJS tambin funciona muy bien con long polling ya que no necesita crear un hilo
para cada peticin, como por ejemplo hacen Python o Ruby. Se pueden hacer APIs que
exploten esta caracterstica, si algunas peticiones requieren un procesamiento largo y el
cliente quiere enterarse del progreso.
Una API REST sencilla, para la gestin bsica de un listado de usuarios, podra
implementarse en NodeJS utilizando smplemente el mdulo http.
Supongamos la siguiente lista de usuarios:
1. var people = [
2. {dni: 111, name: 'Pepe', age: 30},
3. {dni: 222, name: 'Jose', age: 20},
4. {dni: 333, name: 'Carlos', age: 25}
5. ];
Utilizando el mdulo http, sobre el servidor que hemos visto antes, podemos implementar
unas operaciones bsicas:
GET /people
GET /people/<dni>
POST /people/<dni>
PUT /people/<dni>
DELETE /people/<dni>

El cdigo sera como sigue:


1. var http = require('http');
2.
3. http.createServer(function (req, res) {
4.
5. if (req.method === 'GET') {
6.
7. if (req.url === '/people') {
8. res.writeHead(200, {'Content-Type': 'application/json'});
9. res.end(JSON.stringify(people));
10. return;
11. }
12.
13. if (req.url.indexOf('/people/') === 0) {
14. var person = people.filter(function (p) {
15. return (p.dni == req.url.replace('/people/', '')
);
16. })[0];
17. if (!person) {
18. res.writeHead(404);
19. res.end();
20. return;
21. }
22. res.writeHead(200, {'Content-Type': 'application/json'});
23. res.end(JSON.stringify(person));
24. return;
25. }
26.
27. } else if (req.method === 'POST') {
28.
29. if (req.url.indexOf('/people/') === 0) {
30. (function () {
31. var body = '';
32. req.on('data', function (data) {
33. body += String(data);
34. });
35. req.on('end', function () {
36. people.push(JSON.parse(body));
37. res.writeHead(201); res.end();
38. });
39. }());
40. }
41.
42. } else if (req.method === 'PUT') {
43.
44. if (req.url.indexOf('/people/') === 0) {
45. (function () {
46. var body = '';
47. req.on('data', function (data) {
48. body += String(data);
49. });
50. req.on('end', function () {
51. body = JSON.parse(body);
52. people = people.map(function (p) {
53. if (p.dni == req.url.replace('/people/',
'')) {
54. return body;
55. }
56. return p;
57. });
58. res.writeHead(200); res.end();
59. });
60. }());
61. }
62.
63. } else if (req.method === 'DELETE') {
64.
65. if (req.url.indexOf('/people/') === 0) {
66. people = people.filter(function (p) {
67. return (p.dni != req.url.replace('/people/', '')
);
68. });
69. res.writeHead(200); res.end();
70. }
71. }
72.
73. }).listen(3000);
El cdigo no es muy complejo ni extenso. No obstante, existen algunos mdulos
especialmente diseados para la creacin de aplicaciones y servicios

Potrebbero piacerti anche