Title: Serveis RESTful
Course: CFGS - Desenvolupament d'aplicacions web > Section: Planificació d'una aplicació mòbil

Serveis RESTful

Qué és REST?

REST prové de l'acrònim Representational State Transfer que és una arquitectura per al programari pensada per sistemes distribuïts. Aquesta arquitectura està basada en el protocol de comunicacions HTTP i es basa en la idea que cada component és un recurs i que cadascun d'ells pot accedir mitjançat una comunicació HTTP via mètodes standard. La metodologia REST es va introduir per primer cop per Roy Fielding l'any 2000.

En l'arquitectura REST, existeix un servidor REST que proveeix accés als recursos i un client REST que accedeix a aquests recursos. Per fer-ho, cada recurs està identificat per una URL o identificadors globals. Per obtenir les dades, REST retorna els recursos en diverses representacions: mode text, en format JSON o en XML. Actualment JSON és el més popular i el que s'utilitza en la majoria de serveis web.

La idea de REST és substituir els standards apareguts anteriorment que permetien comunicar un client amb un servidor per sol·licitar recursos, emprant capçaleres com el cas de SOAP i XML-RPC

Un servei web REST és un model centrat bàsicament en les dades. Els recursos venen identificats per URLs i poden ser manipulats mitjançant accions especificades en la pròpia capçalera HTTP.

Mètodes HTTP

Els mètodes més coneguts i més emprats en l'arquitectura REST són:

- GET - S'utilitza per a la lectura i accés a un recurs
- PUT - S'utilitza per a la creació d'un nou recurs
- DELETE - S'utilitza per eliminar un recurs
- POST - S'utilitza per actualitzar un recurs ja existent o crear-ne un de nou
- OPTIONS - S'utilitza per a d'altres operacions sobre un recurs

Encara que aquests mètodes siguin els més emprats, dins del protocol HTTP existeixen altres mètodes definits, com CONNECT, TRACE...

Més informació:

[ HTTP/1.1: Method Definitions ]

Requisits Servei RESTful

De manera formal, perquè un servei web es pugui anomenar estrictament RESTful ha de satisfer diverses restriccions, d'aquesta forma aconseguim unes propietats desitjables com rendiment, escalabilitat, simplicitat, modificabilitat, portabilitat i fiabilitat.

- Uniform interface. Defineix una interfície entre el client i el servidor: identifica els recursos mitjançant URIs. El client sempre que tingui permís i mitjançant la seva representació pot modificar o esborrar un recurs. Cada missatge intercanviat entre client i servidor conté prou informació per processar-lo.
- Client-server. Separació entre client i servidor. D'aquesta forma el client no es preocupa de l'emmagatzematge de les dades i aconsegueix un codi font més portable. Aquest fet permet que el desenvolupament del client i del servidor puguin ser independents l'un de l'altre mentre la interfície uniforme entre els dos no sigui alterada.
- Stateless. La comunicació client-servidor no requereix que el servidor hagi de guardar informació del client entre peticions consecutives.
- Cacheable. Les respostes del servidor es poden guardar en una memòria cache, de forma implícita, explícita o negociada, per tal de millorar l'escalabilitat i rendiment del sistema.
- Layered system. El client no assumeix que hi ha una connexió directa amb el servidor final, poden existir sistemes hardware/software entre ells. Per exemple pot haver-hi un servidor intermedi que guardi en cache les respostes del servidor, o existir servidors intermedis per fer balanceig de carrega.

JSON

JSON (prové de l'acrònim JavaScript Object Notation) és un standard obert basat en text per a l'intercanvi de dades i que pot ser directament llegit per humans. En realitat deriva del llenguatge Javascript, de la seva metodologia per representar objectes simples i llistes associatives, que n'anomena objects.

Tot i la seva relació amb JavaScript, aquesta representació de dades té implementacions en diversos llenguatges de programació i la seva representació en MIME és application/json i els arxius que representen estructures en aquest format utilitzen la extensió .json

El format JSON s'utilitza habitualment per serialitzar i transmetre dades estructurades en una connexió de xarxa.

Exemple en JSON:

{"estudiants":[
    {"nom":"David", "cognom1":"Vidal", "cognom2":"Soler"},
    {"nom":"Roser", "cognom1":"Puig", "cognom2":"Ferrer"},
    {"nom":"Pere", "cognom1":"Serra", "cognom2":"Martí"}
]}


JSON igual que XML és un llenguatge de representació de dades en mode text, però amb la diferencia que JSON no conté informació sobre capçaleres i resulta un llenguatge més lleuger, característica molt interessant per a la seva transmissió més efectiva per la xarxa, entre dispositius.

Exemple en XML:

<estudiants>
    <estudiant>
        <nom>David</nom> <cognom1>Vidal</cognom1> <cognom2>Soler</cognom2>
    </estudiant>
    <estudiant>
        <nom>Roser</nom> <cognom1>Puig</cognom1> <cognom2>Ferrer</cognom2>
    </estudiant>
    <estudiant>
        <nom>Pere</nom> <cognom1>Serra</cognom1> <cognom2>Martí</cognom2>
    </estudiant>
</estudiants>

Sintaxi JSON

La sintaxi JSON és similar a Javascript, ja que aquest model de representació en prové directament.

La sintaxi JSON deriva de la sintaxi de notació JavaScript:

- Les dades són parells nom/valor
- Les dades es separen per comes
- Els objectes estan envoltats dels símbols { }
- Els arrays estan envoltats dels símbols [ ]

Exemple nom/valor:

"cognom" : "Puig"

Els valors en JSON poden ser:

- Un número (enter o coma flotant)
- Una cadena de caràcters (entre símbols " " )
- Un booleà (true o false)
- Un array (entre els símbols [ ] )
- Un objecte (entre símbols { } )
- O null

Exemple objecte:

{"nom": "David","cognom1": "Vidal","cognom2": "Soler"}


Exemple array:

"estudiants":[
    {"nom":"David", "cognom1":"Vidal", "cognom2":"Soler"},
    {"nom":"Roser", "cognom1":"Puig", "cognom2":"Ferrer"},
    {"nom":"Pere", "cognom1":"Serra", "cognom2":"Martí"}
]

JSON en Javascript/HTML

Podrem emprar les funcions nadives de Javascript per tractar cadenes de caràcters en format JSON, tal i com es mostra en el següent exemple:

<!DOCTYPE html>
<html>
   <body>
      <h2>JSON en Javascript/HTML</h2>
      <p id="demo"></p>
      <script>
         var text = '{"nom":"David","cognom1":"Vidal","cognom2":"soler"}';

         var obj = JSON.parse(text);

         document.getElementById("demo").innerHTML =
            obj.nom + "<br>" +
            obj.cognom1 + "<br>" +
            obj.cognom2;
      </script>
   </body>
</html>

Codis de retorn HTTP

Alguns serveis REST utilitzen els codis d'estat definits en les especificacions del protocol HTTP per retornar al client el resultat de l'operació sol·licitada. En la capçalera es retorna el codi de resultat i en la part de dades es retorna un missatge o les dades propiament dites, segons estigui definida la API.

Altres serveis retornen sempre el codi HTTP 200 de resposta correcta i dins de les dades en format JSON indiquen l'estat de la resposta que normalment s'acompanya d'una descripció. En podeu veure un exemple en els serveis web de Google Maps que trobareu en l'apartat d'exemples.

Els codis HTTP que es retornen són de 3 dígits i segueixen un esquema similar al següent:

- Codi 1xx - El servidor respon que està treballant en la petició
- Codi 2xx - El servidor ha pogut acomplir correctament amb la petició del client
- Codi 3xx - El servidor indica que pot acomplir la sol·licitud però que hi ha alguna tasca a fer prèviament. Per exemple, reenrutar la petició.
- Codi 4xx - El servidor indica que s'ha produït un error en la petició. Per exemple: 404 el recurs no existeix
- Codi 5xx - El servidor no pot respondre a la vostra petició.

En les especificacions de la pròpia API s'indiquen els codis exactes de retorn i el motiu que l'ocasiona, per tal de poder-ho tractar en el client. Originalment els codis d'estat HTTP varen dissenyar-se per al món web exclusivament, encara que en l'actualitat s'utilitza en aplicacions híbrides de dispositiu mòbil/web. En l'apartat de més informació podeu trobar més orientacions sobre els codis d'estat dissenyats per al protocol HTTP/1.1

Més informació:

[ RFC HTTP/1.1. Response Status Code ]

Exemple RESTful webService

Aquest exemple veurem un servei RESTful que ens permet administrar usuaris.

Servei N. | HTTP Method | URI | Operació | Tipus operació
1 | GET | /UserService/users | Obtenir la llista d'usuaris | Només lectura
2 | GET | /UserService/users/1 | Obtenir l'usuari amb l'identificador 1 | Només lectura
3 | PUT | /UserService/users/2 | Inserir l'usuari amb l'identificador 2 | Escriptura
4 | POST | /UserService/users/1 | Modificar l'usuari amb l'identificador 1 | Escriptura
5 | DELETE | /UserService/users/1 | Eliminar l'usuari amb l'identificador 1 | Escriptura
6 | OPTIONS | /UserService/users | Obtenir la llista d'operacions d'aquest servei web | Només lectura

Altres serveis RESTful:

[ Twitter ]   [ Google MAPS ]