REST: Arquitectura para Servicios Web
REST: Arquitectura para Servicios Web
Realizado por:
1 OBJETIVOS............................................................................................................10
2 INTRODUCCIÓN...................................................................................................11
2.1 Temática de los capítulos................................................................................12
3 CONCEPTOS PREVIOS........................................................................................14
3.1 URL.................................................................................................................14
3.1.1 Sintaxis....................................................................................................15
3.1.2 URI y Referencias URI...........................................................................17
3.1.3 Diferenciación entre mayúsculas/minúsculas..........................................19
3.1.4 URLs en el uso diario..............................................................................19
3.1.5 El gran marco..........................................................................................20
3.2 UUID...............................................................................................................21
3.3 HTTP...............................................................................................................21
3.3.1 Características y funcionamiento............................................................21
3.3.2 Comandos del protocolo HTTP...............................................................24
3.4 XML................................................................................................................29
3.4.1 Conceptos básicos...................................................................................30
3.4.2 DTD: Definición de Tipos de Documentos.............................................32
3.4.3 Entidades.................................................................................................36
3.4.4 Modelo de Objetos de Documentos: DOM.............................................37
3.5 Conclusiones....................................................................................................38
4 SOAP Y WSDL.......................................................................................................39
4.1 SOAP...............................................................................................................39
4.1.1 Concepto de SOAP..................................................................................39
4.1.2 Objetivos de SOAP..................................................................................40
4.1.3 Un ejemplo sencillo de mensajes SOAP.................................................41
4.1.4 Serialización............................................................................................43
4.1.5 Protocolo HTTP mediante SOAP............................................................46
4.2 WSDL..............................................................................................................48
4.3 Conclusiones....................................................................................................52
5 REPRESENTATIONAL STATE TRANSFER: REST..........................................53
5.1 Introducción.....................................................................................................53
5.2 Origen de REST, Roy Thomas Fielding..........................................................54
5.3 Objetivos..........................................................................................................55
5.4 Restricciones de REST....................................................................................55
5.4.1 Cliente-Servidor......................................................................................55
5.4.2 Sin estado (Stateless)...............................................................................56
5.4.3 Caché.......................................................................................................57
5.4.4 Interfaz uniforme.....................................................................................58
5.4.5 Sistema de capas......................................................................................58
5.4.6 Código bajo demanda..............................................................................59
5.5 Elementos arquitectónicos de REST...............................................................59
5.5.1 Datos en REST........................................................................................59
5.5.2 Conectores en REST................................................................................64
5.5.3 Componentes en REST............................................................................67
5.6 Vistas de la arquitectura REST........................................................................68
5.6.1 Vista de proceso......................................................................................68
5.6.2 Vista de conector.....................................................................................70
5.6.3 Vista de datos..........................................................................................71
5.7 HTTP, URI y XML en REST.........................................................................73
5.7.1 Estandarizando la Web............................................................................73
5.7.2 REST aplicado a URI..............................................................................74
5.7.3 REST aplicado a HTTP...........................................................................79
5.7.4 REST y XML..........................................................................................87
5.7.5 Repercusiones de usar HTTP y URI.......................................................88
5.8 Cuestiones por resolver...................................................................................88
5.8.1 David Megginson....................................................................................89
5.8.2 [Link]...............................................................................................98
5.9 Conclusiones....................................................................................................99
6 DEBATE REST-SOAP.........................................................................................100
6.1 PAUL PRESCOD..........................................................................................101
6.1.1 Raíces del debate REST-SOAP [14].....................................................101
6.1.2 Algunos pensamientos sobre la seguridad de REST-SOAP [15]..........109
6.2 ROBERT McMILLAN.................................................................................112
6.2.1 REST, sustituto de SOAP-RPC [16].....................................................112
6.2.2 Una aproximación a los Servicios Web basada en REST [17].............113
6.3 ROY HOOBLER...........................................................................................115
6.3.1 REST puede acabar con SOAP [18]......................................................115
6.4 AMIT ASARAVALA...................................................................................117
6.4.1 Dando un descanso (REST) a SOAP [19].............................................118
6.5 SAM RUBY..................................................................................................120
6.5.1 REST + SOAP [20]...............................................................................120
6.6 TIM BRAY....................................................................................................121
6.6.1 The SOAP/XML-RPC/REST SAGA [21]............................................121
6.7 BENJAMIN CARLYLE...............................................................................124
6.7.1 REST vs Orientación a Objetos [22].....................................................124
6.8 Disenchanted dictionary................................................................................127
6.8.1 REST [23].............................................................................................127
6.9 Conclusiones..................................................................................................129
7 IMPLEMENTACIONES......................................................................................130
7.1 Implementaciones REST en la Web..............................................................130
7.1.1 Amazon..................................................................................................130
7.1.2 eBay.......................................................................................................131
7.1.3 Restlets..................................................................................................131
7.2 Ejemplo de uso de REST...............................................................................132
7.2.1 Conseguir una lista de las partes..........................................................133
7.2.2 Conseguir datos detallados de una parte...............................................133
7.2.3 Emitir una PO (orden de compra).........................................................134
7.3 Errores comunes a la hora de diseñar con REST..........................................134
7.4 Conclusiones..................................................................................................137
8 EVOLUCIÓN Y FUTURO DE REST..................................................................138
8.1 Progresión de REST......................................................................................138
8.2 Futuro de REST según Paul Prescod.............................................................139
8.3 Reflexión personal sobre el futuro de REST.................................................141
9 TEMPORIZACIÓN Y PRESUPUESTO..............................................................142
9.1 Temporización...............................................................................................142
9.2 Presupuesto....................................................................................................143
9.2.1 Costes de personal.................................................................................143
9.2.2 Costes de Software................................................................................143
9.2.3 Costes de Hardware...............................................................................144
9.2.4 Otros costes...........................................................................................144
9.2.5 Resumen presupuestario........................................................................144
10 BIBLIOGRAFÍA:..............................................................................................146
10.1 Bibliografía procedente de la Web................................................................146
10.2 Especificaciones consultadas.........................................................................147
10.3 Bibliografía procedente de libros..................................................................148
INDICE DE FIGURAS
RFC: Request for Comment, conjunto de documentos que recogen estándares o normas
Este estilo de arquitectura salió a la luz de la mano de Roy Thomas Fielding en el año
2000, concibiéndola de una manera abierta (abstracta), pero posteriormente, se le ha ido
dando forma para que encaje perfectamente en el mundo Web, usando las tecnologías
existentes, tales como:
El objetivo principal de este proyecto es realizar una panorámica y estado del arte de los
Servicios Web centrada en REST. Para ello se va a dividir el proyecto en varias tareas u
objetivos secundarios:
REST rápidamente fue calificado como una alternativa a SOAP y da una nueva visión
general de los Servicios Web en entornos distribuidos.
2 INTRODUCCIÓN
Las telecomunicaciones constituyen un elemento clave de la Sociedad de la
Información, facilitando el acceso e intercambio de datos entre personas o máquinas,
sistemas e instituciones. No es posible entender el actual progreso socioeconómico, sin
tener presente el despliegue de redes de comunicaciones cada vez más sofisticadas
(fijas, de cable, satélite, móviles, etc.)
El hombre moderno cada vez quiere realizar una mayor cantidad de tareas con menos
esfuerzo. De todas las tecnologías que actualmente ayudan a hacer esto posible, Internet
es una de las más importantes. Gracias al rápido avance que está teniendo, una persona
puede realizar tareas muy diversas con un coste de tiempo que sería impensable hace
algunas décadas. Desde casa se tiene acceso a prácticamente toda la información
existente en el mundo, se puede realizar una compra, visitar un museo, etc.
Como puede verse, las tareas se simplifican porque se trasladan desde su origen físico
hasta la casa del usuario, a través de Internet. Los responsables de que esto sea posible
son los Servicios Web.
Existen múltiples definiciones sobre lo que son los Servicios Web, lo que muestra su
complejidad a la hora de dar una adecuada definición que englobe todo lo que son e
implican:
El mundo de los Servicios Web data de las últimas dos décadas y poco a poco se está
descubriendo su potencial. Pero para poder explotarlo totalmente, todavía queda mucho
trabajo por hacer. La investigación de esta disciplina no está relegada al ámbito
académico. Las empresas están viendo que el mundo de los Servicios Web puede
ofrecer grandes beneficios al que sepa aprovecharlo. Estas investigaciones
complementarias que existen, son la clave para que los Servicios Web estén avanzando
tan rápidamente
Este proyecto va a presentar REST, que es un estilo de arquitectura para Servicios Web
que surgió en 2002 de la mano de Roy Thomas Fielding. Cuando Roy Fielding sacó a la
luz su disertación, toda la red se hizo eco de ello. Surgieron muchos artículos que
cuestionaban la eficiencia de SOAP. En algunos sectores se creyó que REST podía ser
la solución al monopolio que tenía SOAP.
A continuación se expondrán los capítulos que van a dar forma a este estudio de REST,
indicando la finalidad de cada uno.
3.1 URL
Las URL [RFC 1738] fueron una innovación fundamental en la historia de Internet.
Fueron usadas por primera vez por Tim Berners-Lee en 1991, para permitir a los autores
de documentos establecer hiperenlaces en la World Wide Web (WWW o Web). Desde
1994, en los estándares Internet, el concepto de URL ha sido incorporado dentro del
más general de URI (Uniform Resource Identifier - Identificador Uniforme de
Recurso), pero el término URL aún se utiliza ampliamente.
Aunque nunca fueron mencionadas como tal en ningún estándar, mucha gente cree que
las iniciales URL significan Universal Resource Locator (Localizador Universal de
Recurso). Esta interpretación puede ser debida al hecho de que, aunque la U en URL
siempre ha significado Uniforme, la U de URI significó en un principio Universal, antes
de la publicación del [RFC 2396].
La URL es la cadena de caracteres con la cual se asigna una dirección única a cada uno
de los recursos de información disponibles en Internet. Existe un URL único para cada
página de cada uno de los documentos de la World Wide Web, para todos los elementos
de Gopher y todos los grupos de debate USENET, y así sucesivamente.
protocolo://máquina/directorio/fichero
protocolo://usuario:contraseña@máquina:puerto/directorio/fichero
Una URL se clasifica por su esquema, que generalmente indica el protocolo de red que
se usa para recuperar, a través de la red, la información del recurso identificado. Una
URL comienza con el nombre de su esquema, seguida por dos puntos, seguido por una
parte específica del esquema.
Algunos de los esquemas URL, como los populares "mailto", "http", "ftp" y "file", junto
a los de sintaxis general URL, se detallaron por primera vez en 1994, en el Request for
Comments [RFC 1630].
Los esquemas que usan protocolos típicos basados en conexión usan una sintaxis común
para "URI genéricas", definida a continuación:
esquema://autoridad/ruta?consulta#fragmento
Las URLs empleadas por HTTP, el protocolo usado para transmitir páginas Web, es el
tipo más popular de URL y puede ser usado para mostrarse como ejemplo. La sintaxis
de una HTTP URL es:
esquema://anfitrión:puerto/ruta?parámetro=valor#enlace
Esquema, en el caso de HTTP, en la mayoría de las veces equivale a http, pero
también puede ser https cuando se trata de HTTP sobre una conexión TLS
(para hacer más segura la conexión).
Muchos navegadores Web permiten el uso de la siguiente estructura:
esquema://usuario:contraseña@anfitrión:puerto/... para autenticación
en HTTP. Este formato ha sido usado como una "hazaña" para hacer difícil el
identificar correctamente al servidor involucrado. En consecuencia, el soporte
para este formato ha sido dejado de lado por algunos navegadores. La sección
3.2.1 de RFC 3986 recomienda que los navegadores deben mostrar el usuario /
contraseña de otra forma que no sea en la barra de direcciones, a causa de los
problemas de seguridad mencionados y porque las contraseñas no deben ser
nunca mostradas como texto claro.
Anfitrión, la cual es probablemente la parte que más sobresale de una URL, es
en casi todos los casos el nombre de dominio de un servidor, [Link].:
[Link], [Link], etc.
La porción :puerto especifica un número de puerto TCP. Normalmente es
omitido (en este caso, su valor por omisión es 80) y probablemente, para el
usuario es lo que tiene menor relevancia en todo el URL.
La porción ruta es usada por el servidor (especificado en anfitrión) de
cualquier forma en la que su software lo establezca, pero en muchos casos se usa
para especificar un nombre de archivo, posiblemente precedido por nombres de
directorio. Por ejemplo, en la ruta /wiki/Vaca, wiki sería un (seudo-)directorio
y Vaca sería un (seudo-)nombre de archivo.
La parte mostrada arriba como ?parámetro=valor se conoce como porción de
consulta (o también, porción de búsqueda). Puede ser omitido, puede haber una
sola pareja parámetro-valor como en el ejemplo, o pueden haber muchas de
ellas, lo cual se expresa como ?param=valor&otroParam=valor&.... Las
parejas parámetro-valor sólo son relevantes si el archivo especificado por la ruta
no es una página Web simple y estática, sino algún tipo de página
automáticamente generada. El software generador usa las parejas parámetro-
valor de cualquier forma en que se establezca; en su mayoría transportan
información específica a un usuario y un momento en el uso del sitio, como
términos concretos de búsqueda, nombres de usuario, etc. (Observe, por
ejemplo, de qué forma se comporta URL en la barra de direcciones de su
navegador durante una búsqueda Google: su término de búsqueda es pasado a
algún programa sofisticado en [Link] como un parámetro, y el programa de
Google devuelve una página con los resultados de la búsqueda.)
La parte #enlace, por último, es conocida como identificador de fragmento y se
refiere a ciertos lugares significativos dentro de una página; por ejemplo, esta
página tiene enlaces internos hacia cada cabecera de sección a la cual se puede
dirigir usando el ID de fragmento. Esto es relevante cuando una URL de una
página ya cargada en un navegador permite saltar a cierto punto en una página
larga. Un ejemplo sería un enlace que conduce a la misma página y al comienzo
de la sección. (Observe que cambiará la URL en la barra de dirección del
navegador).
La principal diferencia entre la definición de URI y URL es que las URIs identifican a
cualquier recurso pero no tienen por qué indicar como acceder al mismo. Las URL
indican como acceder al recurso. Como puede verse, la definición de URI es más
genérica, engloba a URL dentro de ella.
Figura 2: URI-URL
El término referencia URI se refiere a un caso particular de una URI, o una porción de
éste, tal como es usada en un documento HTML, por ejemplo, para referirse a un
recurso particular. Una referencia URI habitualmente se parece a una URL o a la parte
final de una URL. Las referencias URI introducen dos nuevos conceptos: la distinción
entre referencias absolutas y relativas, y el concepto de un identificador de fragmento.
Un URL absoluto es una referencia URI que es parecida a las URLs definidas arriba;
empieza por un esquema seguido de dos puntos (":") y de una parte específica del
esquema. Una URL relativa es una referencia URI que comprende sólo la parte
específica del esquema de una URL, o de algún componente de seguimiento de aquella
parte. El esquema y componentes principales se infieren del contexto en el cual aparece
la referencia URL: el URI base (o URL base) del documento que contiene la
referencia.
Una referencia URI también puede estar seguida de un carácter de numeral ("#") y un
puntero dentro del recurso referenciado por el URI en conjunto. Esto no es parte de la
URI como tal, sino que es pensado para que el "agente usuario" (el navegador) lo
interprete después que una representación del recurso ha sido recuperada. Por tanto, no
se supone que sean enviadas al servidor en forma de solicitudes HTTP.
Un HTTP URL combina en una dirección simple los cuatro elementos básicos de
información que son necesarios para recuperar un recurso desde cualquier parte de
Internet:
El protocolo que se usa para comunicar,
El anfitrión (servidor) con el que se comunica,
El puerto de red en el servidor para conectarse,
La ruta al recurso en el servidor (por ejemplo, su nombre de archivo).
[Link]
Donde:
http es el protocolo,
[Link] es el anfitrión,
80 es el número de puerto de red en el servidor (siendo 80 el valor por omisión
para el protocolo HTTP, esta porción puede ser omitida por completo),
/wiki/Special:Search es la ruta de recurso,
?search=tren&go=Go es la cadena de búsqueda; esta parte es opcional.
Muchos navegadores Web no requieren que el usuario ingrese " [Link] para dirigirse
a una página Web, puesto que HTTP es el protocolo más común que se usa en
navegadores Web. Igualmente, dado que 80 es el puerto por omisión para HTTP,
usualmente no se especifica. Usualmente uno sólo ingresa una URL parcial tal como
[Link]/wiki/Train. Para ir a una página principal normalmente se entra
sólo el nombre de anfitrión, como [Link].
Dado que el protocolo HTTP permite que un servidor responda a una solicitud
redireccionando el navegador Web a una URL diferente, muchos servidores
adicionalmente permiten a los usuarios omitir ciertas partes de la URL, tales como la
parte "www.", o el carácter numeral ("#") de rastreo si el recurso en cuestión es un
directorio. Sin embargo, estas omisiones técnicamente constituyen una URL diferente,
de modo que el navegador Web no puede hacer estos ajustes, y tiene que confiar que el
servidor responda con una redirección. Es posible para un servidor Web (pero debido a
una extraña tradición) ofrecer dos páginas diferentes para URLs que difieren
únicamente en un carácter "#".
El término URL también es usado fuera del contexto de la World Wide Web. Los
servidores de bases de datos especifican URLs como un parámetro para hacer
conexiones a éstos. De forma similar, cualquier aplicación cliente-servidor que siga un
protocolo particular puede especificar un formato URL como parte de su proceso de
comunicación.
jdbc:datadirect:oracle://myserver:1521;sid=testdb
Si una página Web está en forma singular y más o menos permanentemente definida a
través de una URL, ésta puede ser enlazada. Éste no siempre es el caso, por ejemplo.,
una opción de menú puede cambiar el contenido de un marco dentro de la página, sin
que esta nueva combinación tenga su propia URL. Una página Web puede depender
también de información almacenada temporalmente. Si el marco o página Web tiene su
propia URL, esto no es siempre obvio para alguien que quiere enlazarse a ella: la URL
de un marco no es mostrado en la barra de direcciones del navegador, y una página sin
barra de dirección pudo haber sido producida. La URL se puede encontrar en el código
fuente y/o en las "propiedades" de varios componentes de la página.
Aparte del propósito de enlazarse a una página o a un componente de página, puede
ocurrir que se quiera conocer el URL para mostrar únicamente el componente, o superar
restricciones tales como una ventana de navegador que no tenga barras de herramientas
y/o que sea de tamaño pequeño y no ajustable.
3.2 UUID
Un Universally Unique Identifier [RFC 4122] es un identificador estándar usado en la
construcción de Software, estandarizado por el Open Software Foundation (OSF) como
parte del Distributed Computing Environment (DCE) [27]. La función de los UUIDs es
permitir a los sistemas distribuidos identificar información única sin necesidad de un
sistema de coordinación central. Así, cualquiera puede crear UUID y usarla para
identificar algo con cierta confianza de que el identificador nunca se usará
inintencionadamente por otra persona. La información etiquetada con UUIDs puede ser
usada en bases de datos simples sin necesidad de resolver conflictos de nombres. El uso
más extendido de este estándar son las Microsoft´s Globally Unique Identifiers (GUIDs)
que implementan este estándar.
550e8400-e29b-11d4-a716-446655440000
3.3 HTTP
Desde el punto de vista de las comunicaciones, está soportado sobre los servicios de
conexión TCP/IP, y funciona de la misma forma que el resto de los servicios comunes
de entornos UNIX: un proceso servidor escucha en un puerto de comunicaciones TCP
(por defecto, el 80), y espera las solicitudes de conexión de los clientes Web. Una vez
que se establece la conexión, el protocolo TCP se encarga de mantener la comunicación
y garantizar un intercambio de datos libre de errores.
Existen tres verbos básicos (hay más, pero por lo general no se utilizan) que un
cliente puede utilizar para dialogar con el servidor: GET, para recoger un objeto,
POST, para enviar información al servidor y HEAD, para solicitar las
características de un objeto (por ejemplo, la fecha de modificación de un
documento HTML).
Cada operación HTTP implica una conexión con el servidor, que es liberada al
término de la misma. Es decir, en una operación se puede recoger un único
objeto. En la actualidad se ha mejorado este procedimiento, permitiendo que una
misma conexión se mantenga activa durante un cierto periodo de tiempo, de
forma que sea utilizada en sucesivas transacciones. Este mecanismo,
denominado HTTP Keep Alive, es empleado por la mayoría de los clientes y
servidores modernos.
Cada objeto al que se aplican los verbos del protocolo está identificado a través
de la información de situación del final de la URL.
Cada vez que un cliente realiza una petición a un servidor, se ejecutan los siguientes
pasos:
2. El cliente Web descodifica la URL, separando sus diferentes partes. Así identifica
el protocolo de acceso, la dirección DNS o IP del servidor, el posible puerto
opcional (el valor por defecto es 80) y el objeto requerido del servidor.
El diálogo con los servidores HTTP se establece a través de mensajes formados por
líneas de texto, cada una de las cuales contiene los diferentes comandos y opciones del
protocolo. Sólo existen dos tipos de mensajes, uno para realizar peticiones y otro para
devolver la correspondiente respuesta. La estructura general de los dos tipos de
mensajes se puede ver en el siguiente esquema de la Figura [4]:
Figura 4: Mensaje HTTP para solicitud/respuesta
La primera línea del mensaje de solicitud contiene el comando que se solicita al servidor
HTTP, mientras que en la respuesta contiene el resultado de la operación que es un
código numérico que permite conocer el éxito o fracaso de la operación. Después
aparece, para ambos tipos de mensajes, un conjunto de cabeceras (obligatorias y
opcionales), que condicionan y matizan el funcionamiento del protocolo.
La separación entre cada línea del mensaje se realiza con un par CR-LF (retorno de
carro más nueva línea). El final de las cabeceras se indica con una línea en blanco, tras
la cual se pueden incluir los datos transportados por el protocolo, por ejemplo, el
documento HTML que devuelve un servidor.
El protocolo HTTP consta de los siguientes comandos que permiten realizar las acciones
pertinentes: GET, HEAD, POST, PUT, DELETE, LINK, UNLINK. A continuación se va
a explicar detenidamente cada uno de ellos:
GET, se usa para recoger cualquier tipo de información del servidor. Se utiliza
siempre que se pulsa sobre un enlace o se teclea directamente a una URL. Como
resultado, el servidor HTTP envía el documento correspondiente a la URL.
Este comando puede ir acompañado de una cabecera con los siguientes parámetros:
From: campo opcional que incluye la dirección de correo electrónico del usuario
del cliente.
Host: especifica la dirección del host del cliente y el puerto de conexión que ha
empleado.
HEAD, que es igual que el comando GET, y puede usar las mismas cabeceras, pero
este comando le pide al servidor que le envíe sólo la cabecera como respuesta. Es
utilizado por los gestores de caché de páginas o los servidores proxy, para conocer
cuándo es necesario actualizar la copia que se mantiene de un fichero.
POST, que tiene un funcionamiento idéntico al comando HEAD, pero además, este
comando envía datos de información al servidor, normalmente originaria de un
formulario Web para que el servidor los administre o los añada a una base de datos.
PUT, actualiza información sobre un objeto del servidor. Es similar a POST, pero
en este caso, la información enviada al servidor debe ser almacenada en la URL que
acompaña al comando. Así se puede actualizar el contenido de un documento.
Estos métodos pueden usarse, por ejemplo, para editar las páginas de un servidor Web
trabajando de manera remota.
Vary: indica que hay mas de una posible respuesta a la petición pero solo elige
una.
Hay otros parámetros de información de cabeceras, que son válidos tanto para
mensajes del cliente como para respuestas del servidor. Estas cabeceras son:
Date: fecha local de la operación. Las fechas deben incluir la zona horaria en
que reside el sistema que genera la operación. Por ejemplo: Sunday, 12- Dec-96
[Link] GMT+01. No existe un formato único en las fechas; incluso es posible
encontrar casos en los que no se dispone de la zona horaria correspondiente, con
los problemas de sincronización que esto produce. Los formatos de fecha a
emplear están recogidos en las [RFC 1036] y [RFC 1123].
Ante cada transacción con un servidor HTTP, éste devuelve un código numérico que
informa sobre el resultado de la operación, como primera línea del mensaje de
respuesta. Estos códigos aparecen en algunos casos en la pantalla del cliente, cuando se
produce un error.
4xx: errores del cliente; el requerimiento contiene algún error, o no puede ser
realizado.
5xx: errores del servidor, que no ha podido llevar a cabo una solicitud.
3.4 XML
La versión 1.0 de XML es una recomendación del W3C (World Wide Web Consortium)
publicada en Febrero de 1998, aunque se llevaba trabajando en ella desde dos años
antes. Está basada en el anterior estándar SGML (Standard Generalized Markup
Language, ISO 8879), que data de 1986, aunque empezó a gestarse a principios de los
70. Éste está a su vez basado en GML, creado por IBM en 1969.
SGML proporciona un modo consistente y preciso de aplicar etiquetas para describir las
partes que componen un documento, permitiendo además el intercambio de documentos
entre diferentes plataformas. Sin embargo, el problema que se le atribuye es su excesiva
dificultad; un indicativo de ella es el hecho de que su recomendación ocupe unas 400
páginas.
Al igual que XML, HTML se también se definió utilizando SGML. En una primera
aproximación, las diferencias entre ambos residen en que HTML es simplemente un
lenguaje, mientras que XML un metalenguaje; es decir, se trata de un lenguaje para
definir lenguajes. De hecho, mediante XML también se podría definir el HTML.
Se puede suponer de este modo que XML constituye la capa más baja dentro del nivel
de aplicación, sobre el que se puede montar cualquier estructura de tratamiento de
documentos, hasta llegar a la presentación.
Uno de los conceptos más relevantes de XML es la distinción entre documentos XML
validados y bien formados:
Bien formados: son todos los que cumplen las especificaciones del lenguaje
respecto a sus reglas sintácticas, aunque sin estar sujeto a los elementos fijados
en un DTD (definición de los elementos que puede haber en el documento
XML). De hecho, los documentos XML deben tener una estructura jerárquica
muy estricta, la cual deben cumplir los documentos bien formados.
Válidos: Además de estar bien formados, siguen una estructura y una semántica
determinada por un DTD. Sus elementos y sobre todo la estructura jerárquica
que define el DTD, además de los atributos, deben ajustarse a lo que él dicte.
Aunque es opcional, prácticamente todos los documentos XML comienzan con una
línea como la primera. Es la encargada de indicar que lo que la sigue es un documento
XML. Puede tener varios atributos (los campos que van dentro de la declaración),
algunos obligatorios y otros no:
Analizando el contenido, se observan una serie de etiquetas que contienen datos. Cabe
señalar la diferencia existente entre los conceptos de elemento y etiqueta: los elementos
son las entidades en sí, lo que tiene contenido, mientras que las etiquetas sólo describen
a los elementos. Un documento XML está compuesto por elementos, y en su sintaxis
éstos se nombran mediante etiquetas.
Existen dos tipos de elementos: los vacíos y los no vacíos. Hay varias consideraciones
importantes a tener en cuenta al respecto:
Toda etiqueta no vacía debe tener una etiqueta de cerrado: <etiqueta> debe estar
seguida de </etiqueta>. Esto se hace para evitar posibles errores de
interpretación.
<ficha><nombre>Alberto</ficha></nombre>
Los elementos vacíos son aquellos que no tienen contenido dentro del
documento. Un ejemplo en HTML son las imágenes. La sintaxis correcta para
estos elementos implica que la etiqueta tenga siempre esta forma: <etiqueta/>.
Hasta aquí llega esta reducida introducción a la sintaxis XML. Aunque la especificación
íntegra es más extensa en cuanto a detalles sintácticos, codificaciones, etc., con lo
expuesto hasta ahora es más que suficiente para el alcance del presente proyecto.
Tal y como se comentó con anterioridad, los documentos XML puede ser válidos o bien
formados. Con respecto a los primeros, también se mencionó que su gramática está
definida en los DTD.
Los DTD no son más que definiciones de los elementos que puede incluir un
documento XML, de la forma en que deben hacerlo (qué elementos van dentro de otros)
y los atributos que se les puede dar. Normalmente la gramática de un lenguaje se define
mediante notación EBNF, que es bastante engorrosa. DTD hace lo mismo pero de un
modo más intuitivo.
<?xml version=”1.0”?>
<!DOCTYPE ficha [
<!ELEMENT ficha (nombre+, apellido+, direccion+, foto?)>
<!ELEMENT nombre (#PCDATA)>
<!ATTLIST nombre sexo (masculino | femenino) #IMPLIED>
<!ELEMENT apellidos (#PCDATA)>
<!ELEMENT direccion (#PCDATA)>
<!ELEMENT foto EMPTY>
]>
<ficha>
<nombre>Alberto</nombre>
<apellidos>Cubo Vlezquez</apellidos>
<direccion>c/Luis Chamizo, 14</direccion>
</ficha>
La forma de incluir el DTD directamente como en este ejemplo pasa por añadir a la
declaración <!DOCTYPE y después el nombre del tipo de documento, en vez de la URI
del DTD, el propio DTD entre los símbolos '[' y ']'. Todo lo que hay entre ellos será
considerado parte del DTD.
En cuanto a la definición de los elementos, tiene la virtud de ser bastante intuitiva: tras
la cláusula <!ELEMENT se incluye el nombre del elemento (el que luego se indicara en la
etiqueta), y después, en función del elemento:
A la hora de indicar los elementos descendientes (los que están entre paréntesis) vemos
que van seguidos de unos caracteres especiales: '+', '*', '?' y '|'. Sirven para indicar qué
tipo de uso se permite hacer de esos elementos dentro del documento:
+: uso obligatorio y múltiple; permite uno o más elementos de ese tipo dentro
del elemento padre, pero como mínimo uno.
Se sabrá del elemento ficha que puede contener los siguientes elementos: un nombre y
unos apellidos como mínimo, pero puede tener más de uno de cada; opcionalmente
puede incluirse una o varias direcciones, pero no es obligatorio; opcionalmente también
se puede incluir una única foto; y por fin, pueden incluirse, aunque no es obligatorio en
ninguno de los dos casos, uno o más teléfonos o uno o más números de fax.
El DTD, por ser precisamente la definición de esa jerarquía, describe la forma del árbol.
La diferencia (y la clave) está en que el DTD define la forma del árbol de elementos, y
un documento XML válido puede basarse en ella para estructurarse, aunque no tienen
que tener en él todos los elementos, si el DTD no obliga a ello. Un documento XML
bien formado sólo habrá de tener una estructura jerarquizada, pero sin tener que
ajustarse a ningún DTD concreto.
Los posibles valores del atributo, entre paréntesis y separados por el carácter |.
Al igual que para los elementos, significa que el atributo puede tener uno y sólo
uno de los valores incluidos entre paréntesis. O bien, si no hay valores definidos,
se escribe CDATA para indicar que puede ser cualquier valor alfanumérico.
También podemos indicar con la declaración ID que el valor alfanumérico que se
le de será único en el documento, y se podrá hacer referencia a ese elemento a
través del atributo y valor.
Por último, si es obligatorio cada vez que se usa el elemento en cuestión declarar
este atributo, es necesario declararlo con la cláusula #REQUIRED; si no lo es, se
debe poner #IMPLIED, o bien #FIXED si el valor de dicho atributo se debe
mantener fijo a lo largo de todo el documento para todos los elementos del
mismo tipo.
<pieza>MiPieza
<color>Rojo</color>
</pieza>
<pieza color="Rojo">MiPieza</pieza>
En la primera forma, el procesador tiene que bajar al siguiente nivel del árbol de
elementos para saber el color de MiPieza, mientras que en el segundo caso lo puede
obtener haciendo referencia directamente el atributo color del elemento en el que estás.
Existen multitud de desarrolladores que prefieren el primer modo por estar más acorde
con la filosofía de XML. Según ella, las etiquetas hacen referencia siempre a su
contenido, sin necesidad de acudir al uso de atributos como se hace en HTML.
3.4.3 Entidades
Anteriormente, se han mencionado los caracteres especiales &, ", ', < y >. Se trata de
entidades que han de escribirse mediante las declaraciones: &, ", ',
< y >. Es decir, que cuando se desee hacer referencia alguna entidad definida
dentro de un mismo documento o en otro externo, se debe utilizar la sintaxis &nombre;.
Por ejemplo, y como uso más simple, se puede crear en un DTD o en el documento
XML una entidad que haga referencia a un nombre largo:
De esta forma, cada vez que se desee que en un documento aparezca el nombre
“Delegación de Alumnos de Telecomunicaciones”, bastará con escribir &DAT;. Se trata
de un sencillo método cuyos beneficios son claros.
El texto al que se hace referencia mediante la entidad puede ser de cualquier tamaño y
contenido. Si se desea incluir una porción de otro documento muy largo que haya sido
guardado aparte, de tipo XML o cualquier otro, se puede hacer de este modo:
Del mismo modo que con los DTDs externos, se indica al procesador con SYSTEM que
la referencia es externa y que lo que sigue es una URI estándar, y es lo que queda
entrecomillado a continuación. Lo expuesto hasta ahora se aplica dentro de documentos
XML, pero no de DTDs. Para incluir entidades en DTDs se debe emplear el carácter %:
El objetivo es que de una vez por todas cualquier script pueda ejecutarse de forma más
o menos homogénea en cualquier navegador que soporte dicho DOM. Tener una
plataforma estándar en la que poder crear contenidos sin temor a no estar soportado por
alguna marca o versión de navegador, que además sea potente y versátil.
Y por supuesto, como el conjunto de piezas que el W3C está creando para su uso en el
intercambio de documentos e información, no estará sujeto al ámbito de los
navegadores, sino que su uso será extensible a cualquier tipo de aplicación que acceda a
esos documentos.
3.5 Conclusiones
En este capítulo se han expuesto los conocimientos básicos que son necesarios para
poder abordar REST y SOAP de manera eficaz. Se han estudiado los conceptos de
localizador de recursos (URL y UUID), protocolo de transferencia (HTTP) y lenguaje
de marcas para describir y estructurar los datos (XML). En el siguiente capítulo se verá
la arquitectura de Servicios Web SOAP y el lenguaje de descripción de Servicios
WSDL. Este estudio será necesario para poder realizar comparaciones entre REST y
SOAP.
4 SOAP Y WSDL
En este capítulo se van se va a ver la arquitectura de Servicios Web SOAP y el lenguaje
de descripción de Servicios WSDL. Este estudio será necesario para poder realizar
comparaciones entre REST y SOAP.
4.1 SOAP
Estas tecnologías han demostrado ser muy efectivas para el establecimiento de sitios
Web, sin embargo presentan una serie de desventajas, como son total incompatibilidad e
interoperabilidad entre ellas, total dependencia de la máquina servidora sobre la que
corren, así como el lenguaje de programación.
• El SOAP envelope que define el marco de trabajo que determina qué se puede
introducir en un mensaje, quién debería hacerlo y si esa operación es opcional u
obligatoria.
Por otra parte, los servidores Web pueden procesar las peticiones de usuario empleando
tecnologías tales como Servlets, páginas ASP (Active Server Pages), páginas JSP (Java
Server Pages) o sencillamente un servidor de aplicaciones con invocación de objetos
mediante CORBA, COM o EJB.
La especificación SOAP (SOAP Specification 1.1) indica que las aplicaciones deben
ser independientes del lenguaje de desarrollo, por lo que las aplicaciones cliente y
servidor pueden estar escritas con HTML, DHTML, Java, Visual Basic o cualquier otra
herramienta o lenguaje disponibles.
4.1.3 Un ejemplo sencillo de mensajes SOAP
Supongamos que tenemos un servicio Web el cual contiene una relación de productos
junto con una serie de características de éstos, y supongamos que le queremos hacer una
consulta acerca del precio de uno de los productos cuyo código es RHAT, el código
relativo a la petición de consulta en lenguaje SOAP sería:
<?xml version="1.0"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="[Link]
SOAP-ENV:encodingStyle="[Link]
<SOAP-ENV:Body>
<getQuote xmlns="[Link]
<symbol>RHAT</symbol>
</getQuote>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
<?xml version="1.0"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="[Link]
SOAP-ENV:encodingStyle="[Link]
<SOAP-ENV:Body>
<Quote xmlns="[Link]
<Price>4.12</Price>
</Quote>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Un mensaje SOAP no es más que un documento en formato XML que está constituido
por tres partes bien definidas que son: el SOAP envelope, el SOAP header de carácter
opcional y el SOAP body. Cada uno de estos elementos contiene lo siguiente:
• El envelope es el elemento más importante y de mayor jerarquía dentro del
documento XML y representa al mensaje que lleva almacenado dicho documento.
Un ejemplo de uso del header, donde se indica un cierto parámetro útil para el servicio
Web que le indica como debe procesar el mensaje sería:
<?xml version="1.0"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="[Link]
SOAP- ENV:encodingStyle= "[Link]
<SOAP-ENV:Header>
<t:Transaction xmlns:t="some-URI" SOAP-ENV:mustUnderstand="1">
5
</t:Transaction>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<getQuote xmlns= "[Link]
<symbol>RHAT</symbol>
</getQuote>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Un ejemplo de uso del nuevo elemento body sería el siguiente, en el que se ha detectado
un error en la aplicación que corre sobre el servidor que provoca que no opere
convenientemente, por lo que se le indica al cliente:
<?xml version="1.0"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="[Link]
SOAP-ENV:encodingStyle= "[Link]
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:Server</faultcode>
<faultstring>Server Error</faultstring>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
[Link] y
[Link] [Link]
Todo mensaje SOAP debe tener un elemento Envelope asociado a la dirección de red
[Link] Si un mensaje recibido por una aplicación
SOAP contiene en este elemento un valor distinto al anterior la aplicación trataría dicho
mensaje como erróneo.
4.1.4 Serialización
A la hora de introducir los datos en un mensaje SOAP existen una serie de normas a
tener en cuenta. De esta forma SOAP define una serie de tipos básicos que serán
empaquetados de forma directa y una serie de mecanismos para empaquetar tipos
complejos y estructurados formados por elementos simples.
En un inicio, SOAP consideró un conjunto de tipos como tipos simples con el fin de
realizar un mapeo directo entre el propio documento SOAP y tipos básicos de Java.
Ahora bien, actualmente este conjunto ha aumentado notablemente de forma que existe
un número bastante grande de tipos que gozan de esta situación. De entre todos ellos
destacan los indicados en la Figura [7].
Además de todos estos tipos sencillos, SOAP implementa una serie de mecanismos para
serializar tipos complejos con elementos simples en su interior. De esta forma tenemos:
• Structs
<Quote xmlns="[Link]
<Symbol>RHAT</Symbol>
<Price>4.12</Price>
</Quote>
En términos de Java tendríamos un objeto de tipo Quote dentro del cual hay dos
elementos sencillos: uno de tipo String llamado Symbol y el otro de tipo double y de
nombre Price. Es decir:
• Arrays
<Bid xsi:type="SOAP-ENC:Array">
<Symbol xsi:type="xsd:token">RHAT</Symbol>
<Price xsi:type="xsd:double">4.12</Price>
<Account xsi:type="xsd:string">777-7777</Account>
</Bid>
<SOAP-ENC:Array SOAP-ENC:arrayType="xsd:double[3,2]">
<SOAP-ENC:double>1.1</SOAP-ENC:double>
<SOAP-ENC:double>1.2</SOAP-ENC:double>
<SOAP-ENC:double>2.1</SOAP-ENC:double>
<SOAP-ENC:double>2.2</SOAP-ENC:double>
<SOAP-ENC:double>3.1</SOAP-ENC:double>
<SOAP-ENC:double>3.2</SOAP-ENC:double>
</SOAP-ENC:Array>
double[][] array = {
{1.1, 1.2},
{2.1, 2.2},
{3.1, 3.2}
}
O un ejemplo algo más complicado sería un Array que contiene a su vez dos arrays
cada uno de los cuales contiene a su vez un Array de Strings:
<SOAP-ENC:Array SOAP-ENC:arrayType="xsd:string[][2]">
<item href="#array-1"/>
<item href="#array-2"/>
</SOAP-ENC:Array>
Una de las funcionalidades con las que cuenta SOAP y que lo hace extremadamente
atractivo es el envío de mensajes SOAP vía protocolo HTTP, todo ello realizado de
forma directa por medio de las librerías de SOAP.
Este hecho provoca que existen ciertas diferencias entre un mensaje SOAP normal y
uno enviado haciendo uso del protocolo HTTP. De esta forma deben cumplirse dos
aspectos:
• El HTTP header del mensaje de petición al servicio Web debe contener un campo
SOAPAction. El campo SOAPAction alerta a los servidores Web y firewalls por los
que pase de que el mensaje contiene documento SOAP, esto facilita a dichos
firewalls el filtrado de las peticiones SOAP sin necesidad de tener que explorar el
contenido del body del mensaje.
Un ejemplo de todo esto sería el siguiente extracto de código en el que lanza una
petición HTTP de tipo POST contra un Servlet que corre en la dirección Web
[Link] bajo el control del usuario de nombre elharo:
<?xml version="1.0"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="[Link] >
<SOAP-ENV:Body>
<getQuote xmlns="[Link]
<symbol>RHAT</symbol>
</getQuote>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
HTTP/1.0 200 OK
Content-Type: text/xml; charset="utf-8"
Content-Length: 260
<?xml version="1.0"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="[Link]
<SOAP-ENV:Body>
<Quote xmlns="[Link]
<Price>4.12</Price>
</Quote>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
4.2 WSDL
En este apartado se verá el lenguaje de descripción de Servicios Web WSDL 1.1 [5],
cuya especificación completa [WSDL 1.1] puede encontrarse en el W3C.
Una descripción formal de los patrones de mensaje resulta aún más importante en el
caso de Servicio Web más complejos. Algunos servicios podrían aceptar una petición
pero no enviar la respuesta correspondiente devuelta al cliente. Otros podrían solamente
enviar mensajes al cliente. Además, el esquema no contiene información sobre cómo
acceder al Servicio Web. Como SOAP es independiente del protocolo, se
intercambiarán los mensajes entre el cliente y el servidor de numerosas formas. ¿Cómo
se sabe si hay que enviar un mensaje mediante HTTP, SMTP o cualquier otro protocolo
de transporte? Más aún, ¿cómo se sabe la dirección la que hay que enviar el mensaje?
Los documentos WSDL definen los servicios como colecciones de puntos finales de red
o puertos. En WSDL, la definición abstracta de puntos finales y de mensajes se separa
de la instalación concreta de red o de los enlaces del formato de datos. Esto permite la
reutilización de definiciones abstractas: mensajes, que son descripciones abstractas de
los datos que se están intercambiando y tipos de puertos, que son colecciones abstractas
de operaciones. Las especificaciones concretas del protocolo y del formato de datos
para un tipo de puerto determinado constituyen un enlace reutilizable. Un puerto se
define por la asociación de una dirección de red y un enlace reutilizable; una colección
de puertos define un servicio. Por esta razón, un documento WSDL utiliza los siguientes
elementos en la definición de servicios de red:
Types: contenedor de definiciones del tipo de datos que utiliza algún sistema de
tipos (por ejemplo XSD).
Message: definición abstracta y escrita de los datos que se están comunicando.
Operation: descripción abstracta de una acción admitida por el servicio.
Port Type: conjunto abstracto de operaciones admitidas por uno o más puntos
finales.
Binding: especificación del protocolo y del formato de datos para un tipo de
puerto determinado.
Port: punto final único que se define como la combinación de un enlace y una
dirección de red.
Service: colección de puntos finales relacionados.
A continuación se detalla un poco más en profundidad cada uno de estos elementos
Elemento_Types:
Elemento message:
Elemento PortType:
Elemento Binding:
Elemento Service:
Elemento Extensibilidad :
4.3 Conclusiones
5.1 Introducción
Una vez definido REST, se estudiará la manera de adaptarlo a las tecnologías Web
actuales; HTTP, URI y XML. Para finalizar el capítulo, se verán los cabos sueltos que
según algunos autores, deja REST en su definición.
Cuando Roy T. Fielding creó REST su disertación, perseguía unos objetivos muy
concretos que Paul Prescod resumió en un artículo [13]:
Para poder conseguir los objetivos que se han comentado en el apartado anterior, REST
define un conjunto de restricciones o características que deben cumplir las arquitecturas
de Servicios Web:
1. Cliente Servidor
2. Sin estado
3. Caché
4. Sistema de capas
5. Interfaz Uniforme
6. Sistema de capas
7. Código bajo demanda
5.4.1 Cliente-Servidor
La primera restricción que tiene REST está en común con el estilo Cliente-Servidor.
Separar lo que es competencia del cliente y el servidor es el principio de todo. Hay que
distinguir lo que concierne al interfaz del usuario del almacenamiento de datos.
Cada petición del cliente debe contener toda la información necesaria para que el
servidor la comprenda y no necesite mirar ningún dato almacenado previamente sobre el
contexto de la comunicación. El estado de la sesión por lo tanto se guarda integramente
en el cliente.
5.4.3 Caché
Las respuestas a una petición deben poder ser etiquetadas como cacheable o no-
cacheable. Si una respuesta es cacheable, entonces al cliente cache se le da permiso para
reutilizar la respuesta más tarde si se hace una petición equivalente.
Las siguientes restricciones que se van a comentar a partir de ahora son realmente las
novedades que pretende aportar REST a las nuevas arquitecturas Web.
Identificación de recursos
Manipulación de recursos a través de sus representaciones
Mensajes auto-descriptivos
Hipermedios como el motor del estado de la aplicación.
Hasta ahora se han visto las restricciones que usa REST para controlar el
funcionamiento y las relaciones entre los distintos elementos (componentes, conectores
y datos). Ahora se va a ver como concibió R. T. Fielding cada uno de estos elementos
para que encajasen dentro de REST.
A diferencia de los estilos basados en objetos distribuidos, donde todos los datos se
encapsulan y son ocultados por los componentes del proceso, la naturaleza y el estado
de los datos son un aspecto clave para REST. La forma racional de diseñar los datos
puede verse en la naturaleza de los hipermedios distribuidos. Cuando se selecciona un
link, la información debe trasladarse desde la localización donde está almacenado hasta
donde será usado (la mayor parte de las veces por un humano). Esto va en contra de
otros procesos distribuidos donde es posible, y a veces más eficiente, mover el “proceso
agente” (procedimiento almacenado, expresión de búsqueda, etc) hasta los datos en vez
de mover los datos hasta el proceso.
1) Renderizar los datos desde donde están localizados y enviar una imagen de formato
fijo al receptor.
2) Encapsular los datos con una herramienta de renderización y enviar ambas cosas al
receptor.
3) Enviar los datos en bruto al receptor junto con el metadato que describe el tipo de
datos, para que el receptor pueda elegir su propia herramienta de renderización.
Hace que la
implementación del
cliente sea más
sencilla.
[Link] Representación
Una representación consiste en datos, metadatos que describen los datos y en ocasiones,
metadatos que describen a los metadatos (normalmente con propósito de verificar la
integridad de un mensaje). Los metadatos suelen venir como parejas nombre-valor,
donde el nombre corresponde a un estándar que define la estructura del valor y la
semántica. Los mensajes de respuesta pueden incluir metadatos de representación y
metadatos de recurso (información sobre el recurso que no es específico a la
representación provista).
El control de datos define el propósito de los mensajes entre componentes, como pueden
ser la acción solicitada o el significado de una respuesta. También se usa para
parametrizar peticiones e invalidar el comportamiento que se tiene por defecto al
conectar varios elementos. Por ejemplo, se puede modificar el comportamiento del
caché controlando los datos del mensaje de petición o el de respuesta.
Dependiendo del control de datos del mensaje, una representación puede indicar el
estado actual del recurso solicitado, el estado deseado o el valor de otro recurso
cualquiera. Algunos casos concretos pueden ser la representación de los datos de
entrada dentro de la petición de un cliente o la representación de las condiciones de
error de una respuesta. Por ejemplo, para añadir un recurso desde una localización
remota, es necesario que el autor envíe una representación al servidor, así se podrán
establecer los valores del recurso para posteriores peticiones. Si el conjunto de valores
de un recurso en un momento dado, consiste en múltiples representaciones, el proceso
de negociación del contenido puede ser usado para elegir la mejor representación.
El formato de los datos de una representación es conocido como tipo de medio (media
type). Una representación puede ser incluida en un mensaje y procesada por el receptor
de acuerdo con el control de datos del mensaje y la naturaleza del tipo de medio.
Algunos tipos de medios están previstos para procesos automatizados, otros para ser
renderizados para que los usuarios los vean y otros son capaces de englobar a estos dos.
Los tipos de medios compuestos se pueden utilizar para incluir representaciones
múltiples en un solo mensaje.
El diseño de un tipo de medio puede afectar directamente a la percepción que tiene un
usuario de los sistemas de hipermedios distribuidos. Cualquier dato que deba ser
recibido antes de que el receptor pueda empezar a renderizar la representación, añade
retraso a la interacción. Un formato de datos que contiene la parte más importante de la
información de renderización al principio del mensaje, puede ser renderizado mientras
el resto de la información está siendo recibida. Esto mejora notablemente la percepción
del usuario al contrario que si tuviésemos que recibir todo el mensaje para empezar a
renderizar.
Por ejemplo, un navegador Web que pueda renderizar un gran documento HTML
mientras está siendo recibido, produce que el usuario tenga una mejor percepción del
funcionamiento que si tuviese que esperar a recibir completamente el documento para
ver algo en el navegador. Esto ocurre aunque el comportamiento de la red en los dos
casos sea el mismo. Hay que darse cuenta de que la habilidad de renderizar y la
capacidad de representación también pueden verse afectada por la elección del
contenido. Si las dimensiones de tablas con tamaño dinámico y los objetos que
transportan deben ser determinadas antes de que puedan ser renderizadas, se sufrirá un
retraso a la hora de ver una página de hipermedios.
Para terminar este apartado sobre los datos en REST se incluye la Tabla [3] que es un
resumen de los datos usados por REST.
REST usa varios tipos de conectores para encapsular las actividades de acceso a
recursos y transferir las representaciones de los recursos, como son los conectores
Cliente, Servidor, Caché, Resolver y Túnel.
Todas las interacciones de REST son sin estado (stateless). Cada petición contiene toda
la información necesaria que necesita un conector para poder comprenderla,
independientemente de las peticiones que hayan sido procesadas con anterioridad. Esta
restricción conlleva cuatro funciones:
2. Permite que las interacciones sean procesadas en paralelo sin que por ello
requieran que el mecanismo de procesamiento comprenda la semántica de la
interacción.
4. Fuerza a que esté presente en cada petición toda la información que influya para
determinar si se puede usar una respuesta cacheable.
La interfaz del conector es similar a una invocación a proceso, pero con diferencias en
el paso de parámetros y resultados.
Los principales tipos de conectores son Cliente, Servidor y Caché (los conectores
Resolver y Túnel pasan a un segundo plano):
Como puede verse en la Figura [16], el cliente solicita al servidor el recurso A. Si este
recurso está definido como cacheable, el servidor caché almacenará la representación
del recurso que se entrega. La siguiente vez que se solicite el recurso A, la petición no
llegará más allá del servidor caché. Si la respuesta hubiese sido etiquetada como no-
cacheable la petición habría sido redirigida de nuevo hasta el servidor.
Algunos conectores de caché son compartidos, esto significa que una respuesta puede
ser usada para responder a otro cliente distinto del que originó la respuesta almacenada
en el caché. Compartir caché es efectivo reduciendo el impacto en aquellos servidores
populares a los que los clientes acceden para obtener la misma información. Es
particularmente efectivo cuando el caché se prepara jerárquicamente para cubrir a
grandes grupos de usuarios, como es el caso de la Intranet de una compañía, los clientes
de un proveedor de servicios de Internet o las Universidades. Sin embargo, el caché
compartido también puede conllevar errores si una respuesta no es la misma
consultando el caché que realizando una nueva petición.
Para terminar este apartado sobre los conectores en REST se incluye la Tabla [4] que es
un resumen de los conectores usados por REST.
Los componentes que tiene REST son: Agente Usuario, Servidor, Gateway (puerta
de acceso) y Proxy.
Un Agente Usuario usa un conector cliente para iniciar una petición y ser el verdadero
receptor de la respuesta. El ejemplo más común es el navegador Web, proporciona
acceso a los servicios de información y renderiza las respuestas del servicio de acuerdo
con las necesidades de la aplicación.
Los componentes de los sistemas intermedios actúan a la vez como cliente y como
servidor para llevar a sus destinos las posibles transacciones, peticiones y respuestas. Un
componente Proxy es un sistema intermedio seleccionado por el cliente para
proporcionar la encapsulación de la interfaz de otros servicios, transporte de datos,
perfeccionamiento del funcionamiento o seguridad. Los componentes de un Gateway
son un sistema intermedio impuesto por la red o el servidor para proporcionar una
encapsulación del interfaz de otros servicios, transmisión de datos, perfeccionamiento
del funcionamiento o seguridad. La diferencia entre proxy y puerta de acceso es que el
cliente es el que determina cuando va a usar un proxy.
A continuación se muestra la Tabla [5] que es una gráfica resumen de los componentes
REST:
Ahora que se han analizado los elementos de REST por separado, puede hacerse uso de
las vistas de la arquitectura para describir las relaciones que existen entre los
elementos, es decir, observar como trabajan los elementos de manera conjunta. Se
usarán tres tipos de vista: Procesos, Conectores y Datos.
La siguiente Figura [17], va a resultar útil para observar el camino que siguen las
peticiones desde que el cliente las realiza. Se muestra un ejemplo de vista de proceso de
una arquitectura basada en REST para un instante determinado durante el
procesamiento de tres peticiones en independientes en paralelo.
REST permite los sistemas intermedios obligando a que los mensajes sean auto-
descriptivos (la interacción es sin estado entre las peticiones). Los métodos estándar y
los tipos de medio se usan para indicar la semántica y el intercambio de información y
las respuestas indican si son cacheables o no de una manera explícita.
Los servicios pueden ser implementados usando una compleja jerarquía de sistemas
intermedios y servidores distribuidos. La naturaleza stateless de REST permite a cada
interacción ser independiente de las demás, eliminando la necesidad de que toda la
topología de componentes se entere de todo, que es una tarea imposible para una
arquitectura basada en Internet. Además permite a los componentes actuar como
destinos o sistemas intermedios, determinándolo dinámicamente según el objetivo de
cada petición. Los conectores solo necesitan conocer la existencia de otros conectores
durante la comunicación, aunque pueden conocer la existencia y capacidades de otros
componentes por razones de funcionamiento.
La vista de datos de una arquitectura nos revela el estado de la aplicación como un flujo
de información a través de los componentes.
REST está concebido para los sistemas de información distribuidos, ve una aplicación
como una estructura cohesiva de información y alternativas de control a través de la que
un usuario puede realizar una tarea. Por ejemplo, buscar una palabra en un diccionario
on-line es una aplicación, igual que realizar una visita a un museo virtual o estudiar
unos apuntes para un examen. Cada aplicación define sus objetivos para los sistemas
subyacentes.
Desde 1994, REST ha sido usado para guiar y diseñar la arquitectura de la Web
moderna. Ahora trataremos de describir la experiencia aprendida de aplicar REST a los
estándares de Internet para HTTP, URI y XML. HTTP y URI son las especificaciones
que definen un interfaz genérico usado por todos los componentes de interacción en la
Web.
REST no esta concebido para capturar todas las posibilidades de uso de los estándares
de protocolos Web. Hay aplicaciones de HTTP y URI que no encajan en el modelo de
aplicación de un sistema de hipermedios distribuidos. Lo importante, sin embargo, es
que REST captura todos los aspectos de los sistemas de hipermedios distribuidos que
son considerados imprescindibles para el comportamiento y funcionamiento de la Web.
Optimizar el comportamiento del modelo dará como resultado un comportamiento
óptimo de la arquitectura Web desarrollada. En otras palabras, REST está optimizado
para el caso común, de manera que las restricciones aplicadas a la arquitectura Web
están optimizadas para ese caso.
Uniform Resource Identifiers (URI) son los elementos más simples de la arquitectura
Web y a la vez los más importantes. URI ha sido conocido por muchos nombres:
direcciones WWW, Universal Document Identifiers, Universal Resource Identifier,
URL y URN. Dejando a un lado el nombre, la sintaxis URI ha permanecido
relativamente sin cambios desde 1992. Sin embargo, la especificación de las direcciones
Web también define el alcance y la semántica de lo que entendemos por recurso, el cual
ha cambiado desde las primeras arquitecturas Web. REST define URI como
identificador de recursos. También definió toda la semántica de la interfaz genérica
para manipular los recursos a través de sus representaciones.
[Link] Redefinición de recurso
[Link] Manipulación
Definir los recursos como una URI que identifica un concepto en vez de un documento,
deja una pregunta: ¿Cómo se accede, manipula o transfiere un concepto para conseguir
algo útil cuando seleccionamos un link de hipertexto? REST responde a esta pregunta
definiendo las cosas que son manipuladas como representaciones del identificador de
recurso, en vez del recurso en sí. Un servidor mantiene la relación entre el identificador
de recurso y el conjunto de representaciones que le corresponden. Por tanto, un recurso
se manipula transfiriendo representaciones a través de una interfaz genérica definida
por el identificador de recurso.
Figura 20: Solicitud recurso
La información que se oculta es una de las claves de la ingeniería del software que
motiva el interfaz uniforme de REST, porque un cliente esta restringido a manipular la
representación de un recurso en vez de acceder directamente a su implementación. La
implementación puede ser construida en la forma deseada por su autor sin que esto
tenga ningún impacto en como los clientes usan la representación. Además si existen
múltiples representaciones del recurso en el instante en el que se quiere acceder a él, un
algoritmo de selección de contenido puede ser usado dinámicamente para seleccionar el
que mejor se adapte a las necesidades del cliente. La desventaja, por supuesto, es que un
recurso no es tan directo como un archivo.
Las URI a las que se accede pueden ser físicas o lógicas. Visto de otra manera, los
recursos a los que acceden los clientes pueden ser generados dinámicamente (URI
lógica). Por ejemplo, si se accede a una aplicación que está conectada a una base de
datos en el servidor, al realizar una consulta, se está solicitando una búsqueda en
concreto, y no hace falta que el servidor tenga almacenadas todas las posibles
combinaciones de las búsquedas como páginas estáticas, puede conectarse a la base de
datos, y cuando obtenga el resultado generar dinámicamente la representación del
recurso.
Este mecanismo también puede ser útil para solicitar una representación de un recurso
en un determinado formato. Por ejemplo, se puede solicitar que la información sea
devuelta en formato XML, HTML… En este caso, el servidor debería acceder al
recurso, generar la representación en el formato que se le indique y entregarla. La
información tendrá diferentes URIs según su representación, por ejemplo:
[Link] o [Link]
[Link] Acceso remoto
Para poder trabajar con un recurso existente, el autor primero tiene que obtener la URI
del recurso fuente específico: el conjunto de URIs que emparejan el manejador
subyacente con el recurso objetivo. No siempre un recurso se mapea como un fichero en
concreto, pero todos los recursos que no son estáticos derivan de otros recursos. Un
autor podría encontrar todos los recursos fuente que deben ser editados para modificar
la representación de un recurso. Los mismos principios se aplican a cualquier forma
derivada de representación, negociación de contenidos, scripts, servlets, configuraciones
de mantenimiento…
Por ejemplo, se va a considerar el caso de lo que ocurre cuando un sitio Web crece en
cuanto al número de usuarios y decide reemplazar sus viejos servidores X basados en
una plataforma XOS por servidores Apache corriendo en FreeBSD. El hardware de
almacenamiento de disco se cambia. El sistema operativo también se cambia. El
servidor HTTP también se cambia. Quizás hasta los métodos de generación de
respuestas se cambian. Sin embargo, lo que no necesitamos cambiar es el interfaz Web:
si se diseña correctamente, el espacio de nombres del nuevo servidor puede migrar
desde el viejo, esto significa que desde la perspectiva del cliente que solo sabe de
recursos y no de cómo están implementados, nada ha cambiado excepto la robustez del
sitio.
Como la mayoría de los sistemas del mundo real, no todos los componentes que se
desarrollan de la arquitectura Web obedecen todas las restricciones presentes en este
diseño de arquitectura. REST ha sido usado para definir mejoras en la arquitectura y
para identificar errores. Los problemas ocurren cuando, debido a la ignorancia o
descuido, una implementación de software se desarrolla violando las restricciones
arquitectónicas. Mientras que los problemas no se puedan evitar en general, es posible
identificarlos antes de que se estandaricen.
Otro conflicto con el interfaz de recursos de REST ocurre cuando el software intenta
tratar la Web como un sistema distribuido de ficheros. Puesto que los sistemas de
ficheros exponen la implementación de su información, las herramientas existen para
poder migrar esa información a través de múltiples sitios para hacer un balance de
cargas y redistribuir el contenido a los usuarios. Sin embargo, pueden hacerlo sólo
porque los ficheros tienen un conjunto de semántica fijo (una secuencia de bits
conocidos) que pueden ser fácilmente duplicados. Por el contrario, tratar de migrar el
contenido de un servidor Web como ficheros fallará porque la interfaz de recurso no
siempre encaja con la semántica de sistema de ficheros, y porque los datos y metadatos
están incluidos y dan sentido a la semántica de una representación. El contenido de un
servidor Web puede ser copiado a sitios remotos, pero solo si se copia también el
mecanismo y la configuración del servidor, o copiando selectivamente solo los recursos
cuyas representaciones se sabe que son estáticas.
HTTP tiene un papel especial en la arquitectura Web por ser el principal protocolo del
nivel de aplicación para la comunicación entre componentes Web, y por ser el único
protocolo diseñado específicamente para transferir representaciones de recursos. Al
contrario que URI, se necesitaron muchos cambios para que HTTP soportase la nueva
arquitectura Web.
Extensibilidad
Mensajes Auto-descriptivos
Métodos HTTP y su uso en REST
[Link] Extensibilidad
HTTP es una familia de protocolos, distinguidos por un número mayor o menor que
comparten el nombre principal porque corresponden al protocolo esperado cuando se
comunican directamente con un servicio basado en el espacio de nombres URL. Un
conector debe obedecer a las restricciones que indica la versión del elemento del
protocolo HTTP incluida en cada mensaje.
La versión HTTP de un mensaje representa las capacidades del protocolo del remitente
y la compatibilidad (el mayor número de versión) del mensaje que se envía. Esto
permite a un cliente usar un subconjunto reducido (HTTP/1.0) de características a la
hora de realizar una petición normal de HTTP/1.1, mientras que al mismo tiempo se le
indica al receptor que soporta una comunicación completa en HTTP/1.0. En otras
palabras, se permite una especie de negociación de la forma del protocolo. Cada
conexión en la cadena de peticiones y respuestas puede operar con el mejor nivel de
protocolo teniendo en cuenta la limitación de algunos clientes o servidores que tomen
parte en la cadena.
La intención del protocolo es que el servidor debería siempre responder con la mayor
versión del protocolo y que se entienda con la mayor versión del mensaje de petición
del cliente. La restricción es que el servidor no puede usar las características opcionales
de su mayor versión del protocolo que no estén presentes en el cliente. No existen
características exigidas de un protocolo que no puedan ser usadas entre versiones
anteriores y posteriores porque sería un cambio incompatible. Las únicas características
de HTTP que pueden depender de la versión del protocolo son las que se interpretan por
sistemas adyacentes de la comunicación, porque HTTP no requiere que toda la cadena
de componentes intermediarios en las peticiones y respuestas tenga la misma versión.
Esas reglas existen para ayudar al despliegue de múltiples revisiones de los protocolos y
para prevenir que los arquitectos de HTTP olviden que el despliegue del protocolo es un
aspecto importante del diseño. Lo realizan haciendo fácil la diferenciación entre
cambios compatibles con el protocolo y cambios incompatibles. Los compatibles son
fáciles de desplegar y la comunicación de las diferencias se puede alcanzar dentro del
flujo del protocolo. Los cambios incompatibles son difíciles de desplegar porque
necesitan asegurar que son aceptados antes de que el flujo del protocolo comience.
[Link].2 Elementos de protocolo extensibles
Desde los orígenes, HTTP no define un conjunto de reglas consistente para definir como
deben desplegarse los cambios dentro del espacio de nombres. Éste era uno de los
primeros problemas abordados por la especificación.
La semántica de la petición del HTTP está significada por el nombre del método de la
petición. La extensión del método está permitida siempre que un conjunto de
semánticas que se puedan estandarizar, pueda ser compartido entre cliente, servidor y
cualquier sistema intermedio que haya entre ellos. Desafortunadamente, las primeras
extensiones de HTTP, específicamente el método HEAD, hicieron que el análisis de
una respuesta HTTP fuera dependiente del conocimiento de la semántica del método
requerido. Esto condujo a una contradicción en el despliegue: si un receptor necesita
conocer la semántica de un método antes de que pueda ser reenviado con seguridad a un
sistema intermedio, entonces todos los sistemas intermedios deben estar actualizados
antes de que se pueda desplegar.
Asimismo, HTTP necesita una regla general para interpretar los nuevos códigos de
estado de la respuesta, de manera que las nuevas respuestas podrían ser desplegadas sin
dañar a los viejos clientes. Por tanto se impone la regla de que cada código de estado
pertenezca a una clase diferenciada por los tres primeros dígitos decimales:
[Link].3 Actualizaciones
REST tiene la restricción de que los mensajes entre componentes sean auto-
descriptivos para soportar un procesamiento inmediato de las interacciones. En este
apartado se estudiarán algunas características de los mensajes HTTP.
Codificación de capas
Independencia semántica
Límites de tamaño
Control de Caché
HTTP/1.0 y HTTP/1.1 incluyen la información de la URL del host de destino dentro del
campo cabecera de un mensaje de petición. El despliegue de esta característica se hizo
tan importante que la especificación HTTP/1.1 indica que se rechace cualquier petición
que no contenga el campo host. Como resultado, existen muchos servidores ISP que
contienen decenas de miles de sitios Web virtuales basados en el nombre, que
comparten la misma dirección IP.
HTTP hereda su sintaxis de MIME. MIME no define tipos de medios basados en capas,
prefiere colocar una etiqueta del tipo de medios exterior dentro del valor del campo del
tipo de contenido. Sin embargo, esto impide a un receptor determinar la naturaleza de
un mensaje codificado sin decodificar las capas. Una de las primeras extensiones de
HTTP trabajaba sobre este fallo listando la codificación de las capas externas de forma
separada dentro del campo de codificación de contenido, y colocando una etiqueta para
los tipos de medios en el tipo de contenido. Esta fue una solución bastante mala porque
cambiaba la semántica del tipo de contenido sin cambiar el nombre del campo, como
resultado creaba confusión.
Una solución mejor habría sido continuar tratando el tipo de contenido como el tipo de
medio más externo, y usar un nuevo campo para describir el tipo anidado dentro de ese
tipo. Desafortunadamente, la primera extensión fue desplegada antes de identificar el
fallo.
Para HTTP/1.1 se definió la codificación para “partes”, con ella, para una
representación cuyo tamaño es desconocido al comienzo de su generación (cuando se
envía el campo cabecera), se permite dividirla en pedazos de los cuales se conocen su
tamaño. Con este método también se permite enviar los metadatos al final del mensaje,
permitiendo así crear metadatos opcionales al principio mientras se están generando, sin
añadir tiempo de retardo.
En el protocolo HTTP, no hay límites para la longitud del URI, del campo cabecera, de
la longitud de la representación, o de la longitud de cualquier valor de un campo que
consista en una lista de datos. Aunque los antiguos clientes Web tienen problemas bien
conocidos con las URI de más de 255 caracteres, esto es suficiente para darse cuenta de
que el problema está en la especificación de HTTP y no en limitar a todos los
servidores.
Todos los recursos transforman una petición (que consiste en un método, campo
cabecera de petición, y a veces una representación) en una respuesta (que consiste en un
código de estado, campo de cabecera de la respuesta, y a veces una representación).
Cuando una petición HTTP puede dar lugar a múltiples representaciones en el servidor,
el servidor puede mantener una negociación del contenido con el cliente para determinar
cuál es la representación que mejor se adapta a las necesidades del cliente. Esto es
realmente una selección de contenido más que una negociación.
Usar los métodos HTTP GET, POST, PUT y DELETE, es suficiente para poder
implementar cualquier Servicio Web. A continuación se adjunta la Tabla [7] en la que
se indica la función de cada uno dentro de una comunicación REST.
MÉTODO FUNCIÓN
GET Solicitar recurso
POST Crear recurso nuevo
PUT Actualizar o modificar recurso
DELETE Borrar recurso
Todos los Servicios accesibles vía HTTP deben ser idempodentes [8], “Idempodente”
significa que una vez que se le pasa un mensaje a un Servicio, no existen efectos
adicionales si se pasa el mismo mensaje de nuevo. Por ejemplo, un mensaje cuya
función es borrar datos, “Borra el recurso A”. Se puede enviar una vez, o diez veces
consecutivas, pero todo debe quedar igual al final de cada procesado del mensaje. De la
misma manera, GET es siempre idempodente, porque no afecta al estado. Los métodos
GET, DELETE, PUT y POST que usa REST, están concebidos para ser idempodentes.
Como se puede ver en la Figura [27], si llega una petición GET, y existen dudas sobre
su intención, el administrador del servidor podrá estar tranquilo porque GET, por su
propia definición, sólo puede solicitar recursos y por lo tanto no le está permitido
modificar los datos del servidor.
La transparencia también tiene su repercusión en el tiempo de respuesta. Los sistemas
intermedios pueden decidir rápidamente si una respuesta entregada por el servidor es
“cacheable” (por tanto, debe ser almacenada), o si una petición del usuario puede ser
respondida desde caché. Lo único que necesitan mirar es la cabecera del mensaje.
Este autor trata de plantear y dar solución a cuatro aspectos del diseño de servicios Web
REST: la identificación de recursos, el descubrimiento de servicios, el significado de los
enlaces y la normalización. En un último apartado habla de la carencia que tiene REST
en cuanto a la estandarización de los tipos de contenido.
REST ahora tiene un significado más amplio y es fácil de explicar: piezas de datos
(probablemente codificados con XML) situadas en la Web, que manipulamos usando
los métodos HTTP GET, PUT y DELETE (prácticamente CRUD, excepto que Create y
Update se encuentran combinadas en PUT). Si Tratamos de explicar SOAP en una
sencilla frase como ésta, veremos la diferencia que existe.
Esta simplicidad debe hacer sonar algunas alarmas. ¿Esconde REST algunas trampas?
Los Restafarians (adeptos a REST) señalan que REST constituye las bases del éxito de
la Web, pero eso es solamente la parte GET (y POST). Tenemos muy poca experiencia
usando PUT y DELETE en las páginas Web normales, y menos todavía para mantener
datos almacenados. Incluso los grandes servicios de ventas de Amazon y eBay usan sólo
GET (y POST en el caso de eBay); de hecho, la mayoría de los firewalls vienen
configurados por defecto para bloquear PUT y DELETE desde que los administradores
Web los ven como posibles agujeros de seguridad.
REST es más manejable que XML-RPC y WS-* a la hora de usar XML en la Web, pero
hay algunos temas que debemos tratar antes. El mantenimiento de los datos no es fácil,
y mientras que WS-* lo hace más difícil de lo que debe ser, ni el más simple de los
modelos REST lo hace trivial. Vamos a estudiar algunos aspectos del diseño REST que
son importantes:
Identificación
Listar y descubrir recursos
El significado de un enlace
¿Cuánta normalización?
La palabra “C” (contenido)
[Link] Identificación
<airport>
<icao>CYOW</icao>
<name>Macdonald-Cartier International Airport</name>
<political>
<municipality>Ottawa</municipality>
<region>ON</region>
<country>CA</country>
</political>
<geodetic>
<latitude-deg>45.322</latitude-deg>
<longitude-deg>-75.669167</longitude-deg>
<elevation-msl-m>114</elevation-msl-m>
</geodetic>
</airport>
No sabemos exactamente como trataría con esto un procesador XLink. ¿Se resolvería la
URL relativa “[Link]” como [Link] o
como [Link] También existe
la posibilidad de que algunas APIs bastante experimentadas ya, “digieran” primero el
atributo xml:base de manera que el código de la aplicación nunca lo viese. ¿Verá la
gente que apoya el estándar XML que el uso de xml:base es legítimo?
Si xml:id no se puede usar, y xml:base da problemas, parece que no hay una manera
estándar de identificar documentos XML REST, y cada tipo de documento XML
necesitará su propia solución. ¿Necesita el mundo otro atributo del tipo xml:*?
Digamos que tenemos una gran colección de de datos XML con URLs como:
[Link]
[Link]
Como todos comparten el mismo prefijo, sería razonable asumir que usar una operación
HTTP GET en ese prefijo ([Link] devolverá una lista
de enlaces a todos los datos (debemos reconocer que las URL son opacas y por tanto
nadie debería caer en la cuenta de esto, pero sólo es un ejemplo):
<airport-listing xmlns:xlink="[Link]
xml:base="[Link]
<airport-ref xlink:href="[Link]"/>
<airport-ref xlink:href="[Link]"/>
<airport-ref xlink:href="[Link]"/>
...
</airport-listing>
Esto es un ejemplo maravilloso de REST porque muestra como un motor de búsqueda
podría encontrar e indexar cada recurso XML. Sin embargo, alguien que haya trabajado
en un sistema grande puede ver que hay un problema de escalabilidad (dejando de lado
otros problemas de privacidad y seguridad). Para una lista de varias docenas de
recursos, es una gran aproximación. Para una lista de varios cientos, es manejable. Para
una lista de varios miles de recursos, empieza a tener un gran consumo de ancho de
banda cada vez que alguien hace un GET, y para una lista de varios millones de
recursos, es simplemente ridículo.
Las aplicaciones basadas en HTML diseñadas para humanos normalmente emplean una
combinación de búsqueda y paginación para tratar de descubrir recursos de una gran
colección. Por ejemplo, podríamos empezar especificando que estamos interesados sólo
en los aeropuertos que se encuentran a 200km de Toronto, la aplicación devolvería una
única página de resultados (los 20 primeros resultados), con un enlace para dejarnos ver
la siguiente página si nos interesa.
Esto no es exactamente el tipo de URL REST que hay en los ejemplos, pero es parecida
a la que se usa en los servicios Web REST de Amazon, por lo que quizás no estemos tan
desencaminados. Por supuesto, deberá haber alguna manera para que los sistemas
conozcan cuales son los parámetros disponibles. Ahora, quizá, el resultado sea algo
como esto (asumiendo 20 resultados en la página):
<airport-listing xmlns:xlink="[Link]
xml:base="[Link]
iap=yes">
<airport-ref xlink:href="[Link]"/>
<airport-ref xlink:href="[Link]"/>
<airport-ref xlink:href="[Link]"/>
...
<next-page-link xlink:href="[Link]
point=cyyz&radius=500nm&has-iap=yes&start=21"/>
</airport-listing>
Esto es un buen uso de REST, porque el recurso XML contiene su propia información
de transición (como un enlace a la siguiente página). Sin embargo, es increíblemente
feo. Presumiblemente, el mismo tipo de paginación podría funcionar con la colección
entera cuando no hay parámetros de búsqueda, de manera que:
[Link]
o
[Link]
Deberían devolver las 20 primeras referencias a aeropuertos, seguidas de un link a
[Link] que devolverá las siguientes 20
entradas y así sucesivamente. La potencia de REST y XLink está clara: es posible
comenzar con una única URL y descubrir todos los recursos disponibles
automáticamente, al contrario que WS-*, se realiza sin tener que tratar con voluminosas
especificaciones como UDDI y WSDL.
El verdadero corazón de REST en su sentido original (todo debe tener una URL) y su
sentido más popular y amplio (HTTP + XML como alternativa a los servicios Web), es
“enlazar”. REST insiste en que cualquier información que se pueda recuperar debe
tener una única dirección que podamos hacer circular, de la misma manera que podemos
pasar un número de teléfono o una dirección de e-mail. Esas direcciones hacen posible
enlazar recursos (páginas HTML o en el futuro, ficheros de datos XML) en la Web, de
manera que las personas o los agentes software puedan descubrir páginas nuevas
siguiendo enlaces desde otros existentes.
Pero, ¿Qué significa enlace? Esta cuestión afecta mucho a cualquiera que escriba
software REST de propósito general, como motores de búsqueda, navegadores, o
herramientas de bases de datos, que no están diseñadas para trabajar con un simple
vocabulario de marcas XML. Los especialistas de hipertexto pre-HTML creían que los
enlaces podían tener diferentes significados, querían proporcionar una manera de que el
autor los especificara; escondidos en la sombra durante la revolución de la Web de los
años 1990s, la vieja escuela trató de añadir a XLink el universalmente ignorado atributo
xlink:type. ¿Necesitamos xlink:type para el procesado de datos XML en un ambiente de
trabajo REST? La respuesta es que no, de hecho, si nos fijamos, enlazar un recurso
externo desde un documento HTML siempre significa la misma cosa:
En cada caso, el elemento que contiene el atributo del enlace, proporciona algo de algún
otro lugar. Obviamente, causa distintos comportamientos del navegador. El dibujo se
insertará en el documento mostrado automáticamente, mientras que la entrada
Renacimiento de Wikipedia no lo hará. Pero en ambos casos, las cosas que se enlazan
representan algo más completo: el artículo de Wikipedia sobre el Renacimiento es más
completo que la frase “Renacimiento” y la imagen [Link] es más completa que el
texto alternativo “Ilustración de Galileo”
Exactamente los mismos principios se aplicarán a los enlaces en los ficheros de datos
XML, como en este ejemplo:
<person xml:base="[Link]
xmlns:xlink="[Link]
<name>Jane Smith</name>
<date-of-birth>1970-10-11</date-of-birth>
<employer xlink:href="[Link] Widgets,
Inc.</employer>
<country-of-birth xlink:href="[Link]
of-birth>
</person>
[Link].3 Futuro
Si realmente enlazar resulta tan sencillo, podremos hacer grandes cosas con datos XML
y REST incluso si no estamos de acuerdo con una codificación común del contenido.
Esto podría ser enormemente valioso: los documentos Web tuvieron una gran acogida
precisamente porque la codificación del contenido se estandarizó mediante HTML. Si
pudiésemos hacer lo mismo con los documentos Web XML sin tener que forzar a todo
el mundo a encajar sus datos en algo como RDF o XTM, se podría conseguir suficiente
gente que lo usara para que la idea funcionase.
<film>
<title>Sixteen Candles</title>
<director>John Hughes</director>
<year>1984</year>
<production-companies>
<company>Channel Pictures</company>
<company>Universal Pictures</company>
</production-companies>
</film>
O ¿debería enlazar a diferentes documentos XML que contengan información sobre las
personas, compañías y el resto de datos?
<film xml:base="[Link]
xmlns:xlink="[Link]
<title>Sixteen Candles</title>
<director xlink:href="[Link]"/>
<year>1984</year>
<production-companies>
<company xlink:href="[Link]"/>
<company xlink:href="[Link]"/>
</production-companies>
</film>
Presumiblemente, el servidor REST está creando la información XML desde una base
de datos relacional que esté normalizada, por lo que el mantenimiento de los datos no es
un problema. Aún así, cada ejemplo tiene sus desventajas.
En el primer ejemplo, la aplicación cliente no puede estar segura de que dos
películas diferentes estén referidas al mismo director o productor, o de que
alguna otra pueda tener el mismo nombre. También será difícil que el servidor
pueda manejar una petición PUT para actualizar la base de datos normalizada.
¿Es la mejor solución imitar a HTML? Los enlaces HTML normalmente incluyen una
referencia a recursos externos y una breve descripción de ese recurso (por ejemplo, el
texto azul en el que solemos pinchar para acceder al enlace). No hay ninguna razón por
la que los ficheros XML de una aplicación REST no puedan hacer lo mismo, combinar
las ventajas de las aproximaciones normalizadas y no-normalizadas, como en este
ejemplo:
<film xml:base="[Link]
xmlns:xlink="[Link]
<title>Sixteen Candles</title>
<director xlink:href="[Link]">John Hughes</director>
<year>1984</year>
<production-companies>
<company xlink:href="[Link]">Channel Pictures</company>
<company xlink:href="[Link]">Universal Pictures</company>
</production-companies>
</film>
Ahora, una aplicación cliente REST no necesita solicitar ficheros de datos extra
solamente para encontrar el nombre del director o de la productora, pero si sabe donde
debe mirar para conocer información más completa. También puede usar la URL del
enlace como identificador para evitar la ambigüedad en la gente y las compañías (las
que son las mismas o sólo coincide el nombre). La aproximación además les será
familiar a los desarrolladores Web que decidan usar REST para solicitar datos.
Ahora que estamos cerrando las cuestiones de diseño, debemos hablar sobre el mayor
problema de REST: el contenido.
Los principios de REST nos cuentan como manejar los recursos, pero no lo que
podemos hacer con ellos. Este problema no lo comparten otras aproximaciones de red:
XML-RPC define lo que significa el contenido XML hasta el punto de que se puede
serializar y deserializar automática e invisiblemente; SOAP permite en principio
cualquier tipo de carga XML (asumiendo que se envuelve en el sobre SOAP), aunque la
mayoría de la gente usa la codificación por defecto de SOAP (que también puede ser
serializada y deserializada automáticamente). REST, por otra parte, es pura arquitectura
y no menciona directamente al contenido. Los adeptos a REST presumen de que ya hay
aplicaciones REST funcionando como son Amazon, eBay o Flickr, pero los
desarrolladores rápidamente entienden que no van a conseguir ningún beneficio: cada
aplicación REST requiere sus propios mecanismos, porque usa diferentes formatos de
contenido. Si usaran XML-RPC o SOAP, habría muchas librerías estándar que
simplificarían el trabajo de los desarrolladores y se podría compartir el código.
En términos prácticos, ¿Es REST sólo una palabra de marketing? Los defensores de
REST pueden argumentar que la carencia de una estandarización del contenido es algo
beneficioso, porque hace que la arquitectura sea más flexible a la hora de tratar con
cualquier tipo de recurso, desde un fichero XML hasta una imagen, un video o una
página HTML. Por otra parte, la carencia de un estándar en el formato del contenido
dificulta hacer cosas útiles con los recursos una vez que los hemos solicitado. Ya se han
propuesto candidatos para la codificación XML estándar de REST, incluyendo RDF y
XTM, aunque parece que ninguno tendrá éxito porque RDF (el líder) nunca ha
funcionado correctamente con la mayoría de especificaciones basadas en XML como
XQuery o XSLT.
Usando el atributo xlink:href es posible que programas como los “spider” localicen
fácilmente los enlaces sin importar el tipo de documento. Junto con xlink:ref, xml:id
permite a los enlaces apuntar a fragmentos de los documentos XML de manera sencilla.
<data>
<person xml:id="dpm">
<name>David Megginson</name>
<person>
<weblog>
<title>Quoderat</title>
<author xlink:href="#dpm"/>
</weblog>
</data>
Esta característica es muy importante porque REST está basado en los enlaces. La
carencia de un mecanismo estándar para los enlaces acabaría con REST incluso antes de
que comenzase.
¿Necesitamos tipos de datos para todo en XML? El uso de esquemas externos suele ser
una mala idea por razones de funcionamiento y seguridad. Si queremos crear un tipo
para todo (al menos para los tipos de datos simples), debemos hacerlo en el propio
documento usando algo similar al atributo xsi:type.
<start-date xsi:type="xsd:date">2005-02-23</start-date>
5.8.2 [Link]
El grupo [Link] [12] hizo una crítica a REST en la que determinaba que no era
válido para soportar aplicaciones B2B por las siguientes razones:
State Alignment: REST no ofrece ninguna pista para conseguir la alineación del
estado. Eso no importa mucho en la Web, sin embargo, no funciona en los escenarios
de negocios reales. Siempre que Amazon utilice una API basada en cliente/servidor, las
cosas funcionarán bien porque un cliente recibiendo una respuesta es suficiente para
conseguir una alineación del estado. Pero tan pronto como Amazon cambie para poder
soportar escenarios de negocio más complejo, esto se convertirá en un problema más
grande y SOAP será necesario.
Estado parcial: REST asume que la representación del estado se transfiere libremente
entre el cliente y el servidor. Esto puede que sea cierto en las páginas Web, pero no es
cierto en los negocios Web. Es tremendamente raro que una parte transfiera
completamente el estado de un objeto de negocio y la otra parte lo adquiera y actualice
su estado. En este punto es en el que se hacen necesarios nuevos verbos. Esto es lo que
realmente está haciendo Amazon con los carros de la compra.
En resumen, REST no es una arquitectura válida para los servicios B2B (business to
business).
5.9 Conclusiones
En este capítulo ha quedado recogida una visión actual del estilo de arquitectura REST.
La base del capítulo ha sido la disertación de Roy Thomas Fielding, aunque también se
han añadido algunos detalles del funcionamiento que surgieron posteriormente. En el
siguiente capítulo se intentará dar una visión general del debate que ha existido en la
Web entorno a la comparación entre REST y SOAP. Se expondrán los artículos más
relevantes que se han escrito hasta el momento.
6 DEBATE REST-SOAP
En este capítulo se pretende dar una visión general del debate que ha existido en la Web
entorno a la comparación entre REST y SOAP. Se exponen los artículos más
importantes que se han escrito hasta el momento.
Desde que REST salió a la luz, siempre ha habido un debate en torno a su comparación
con SOAP. REST fue rápidamente catalogado como alternativa a SOAP. Aún así,
actualmente SOAP todavía posee el monopolio en el mundo de los Servicios Web.
Ambos difieren en muchos aspectos comenzando por que REST fue concebido en el
ámbito académico y SOAP es un estándar de la industria, creado por un consorcio del
cual Microsoft formaba parte.
REST no permite el uso estricto de “sesión” puesto que por definición es sin
estado, mientras que para SOAP, al ser orientado a RPC, los servicios Web
crean sesiones para invocar a los métodos remotos.
SOAP utiliza HTTP como un túnel por el que pasa sus mensajes, se vale de
XML para encapsular datos y funciones en los mensajes. Si dibujásemos una
pila de protocolos, SOAP iría justo encima de HTTP, mientras que REST
propone HTTP como nivel de aplicación.
Este tema ha sido ampliamente discutido en la red durante los últimos años. Ahora
expondremos las opiniones de los autores más importantes que se han pronunciado al
respecto.
Fue uno de los primeros autores en estudiar la disertación de Roy Fielding y emitir su
juicio respecto al debate REST-SOAP. A continuación expondremos dos artículos
especialmente importantes.
6.1.1 Raíces del debate REST-SOAP [14]
Este artículo hace un resumen de lo que es REST, y su comparación con SOAP. Explica
que WSDL puede convertirse en un cuello de botella. Además, incide en los beneficios
de usar URI para tener un sistema de direccionamiento global.
Fielding desarrolló las ideas de REST pero no argumentó si REST o HTTP constituían
unas bases suficientes para una arquitectura de servicios Web. Él nunca ha dicho si creía
que era necesaria una arquitectura de servicios Web distinta de la arquitectura Web.
Algunos han llegado a la conclusión de que no es necesaria. Nosotros sentimos que la
arquitectura Web y REST son ya unas bases viables para la arquitectura de servicios
Web.
REST enfatiza:
El segundo objetivo, “generalidad de las interfaces”, es la clave que hace que REST
plantee unas bases mejores que SOAP para el marco de trabajo de los servicios Web.
Cualquier cliente HTTP puede hablar con cualquier servidor HTTP sin necesidad de
configuración. Esto no le ocurre a SOAP. Con SOAP, deben conocerse los nombres de
los métodos, el modelo de direccionamiento y los modelos de procesamiento de cada
servicio en particular. Esto ocurre porque HTTP es un protocolo de aplicación mientras
que SOAP es un marco de trabajo para el protocolo.
Identificación de recursos
Manipulación de recursos a través de sus representaciones
Mensajes auto-descriptivos
Hipermedios como el motor del estado de la aplicación
REST obliga a que los mensajes HTTP sean tan auto-descriptivos como sea posible.
Esto permite que los sistemas intermedios puedan interpretar los mensajes y mejoren el
comportamiento con los usuarios. Uno de los modos con los que HTTP realiza esto es
estandarizar los métodos, las cabeceras y los mecanismos de direccionamiento. Por
ejemplo los servidores caché conocen que por defecto GET es “cacheable” (porque no
puede tener efectos colaterales al solicitar una representación de un recurso). Por el
contrario POST es no-cacheable por defecto. HTTP es un protocolo sin estado, y si se
usa correctamente, es posible interpretar cada mensaje sin conocer los mensajes que
existieron anteriormente, ni los que le seguirán. Por ejemplo en vez de usar “loggin in”
de la manera que lo hace FTP, HTTP envía la información nombre/contraseña en cada
mensaje.
Finalmente. REST describe un mundo en el que cada hipermedio es el motor del estado
de la aplicación. Esto significa que el estado actual de una aplicación Web particular
debe estar capturado en uno o más documentos de hipertexto, residiendo en el cliente o
en el servidor. El servidor conoce el estado de sus recursos pero no va almacenando los
pasos de cada “sesión” de un cliente. Es el cliente quien conoce la misión que se
necesita completar. Es responsabilidad del cliente ir navegando de recurso en recurso,
recopilando la información que necesita y cambiando el estado cuando lo necesita.
Hay millones de aplicaciones Web que implícitamente hacen uso de las restricciones de
HTTP. Hay una disciplina detrás de cada sitio Web escalable y que puede ser aprendida
de varios estándares y documentos de arquitectura Web. También es cierto que muchos
sitios Web comprometen uno o más de esos principios para hacer cosas que van en
contra de la arquitectura como puede ser almacenar los movimientos que hace un
usuario en un sitio Web. Este almacenamiento es posible dentro de la infraestructura
Web, pero influye negativamente en la escalabilidad porque transforma lo que es
esencialmente sin conexión en algo basado en conexión.
Aunque REST y HTTP hace uso de muchas reglas y principios, algunas de ellas pueden
colapsar. Por ejemplo si queremos hacer un sitio HTML de gran calidad, ¿Cómo
debemos hacerlo? La respuesta, es que podemos cambiar y usar representaciones XML.
Los defensores de REST han llegado a creer que esas ideas son tan aplicables para los
problemas de integración de las aplicaciones como para los problemas de integración
del hipertexto. Fielding es bastante claro cuando dice que REST no es la solución
absoluta para todo. Señaló que su diseño de las características no sería apropiado para
otro tipo de aplicaciones de red. Nada más lejos, los que han elegido adoptar REST
como modelo de servicios Web, sienten que al menos articula una filosofía de diseño
con sus puntos fuertes, sus puntos débiles y áreas donde se puede aplicar.
SOAP ahora no es muy útil. Después de su primera versión, hubo un periodo enfocado
al crecimiento en la extensibilidad. Las cabeceras SOAP cada vez se hicieron más
prominentes y sofisticadas. SOAP desarrolló un mecanismo para poder correr bajo
múltiples protocolos de transporte. SOAP creció de ser un protocolo a ser un marco de
trabajo para protocolos. En otras palabras, SOAP creció y cambió tan drásticamente que
ahora los defensores de SOAP pueden despreciar una característica (el tipo de sistema
de SOAP) que una vez fue considerada la principal razón de la existencia de SOAP.
Sus objetivos han cambiado tan drásticamente que la palabra SOAP pasó de ser un
acrónimo de “Simple Objet Access Protocol” a ser simplemente un nombre sin
significado.
Los cambios más recientes se han hecho para responder a las críticas de los defensores
de REST. Se señaló que SOAP abusa de HTTP y falla al integrarse correctamente en la
arquitectura Web. Esos cambios todavía no han sido desarrollados en ninguna
herramienta y puede que nunca lo hagan. Pero los cambios son por lo menos un signo
de que hay esperanza.
Una de las mayores diferencias entre el punto de vista de REST y de SOAP es que
REST ve la Web como un sistema de información por sí misma y dice que los otros
sistemas deberían estar integrados en el sistema de información por medio de gateways.
Los estándares de servicios Web nunca fueron diseñados para usar URI como
identificadores de recurso y de hecho WSDL hace que esto sea esencialmente
imposible. No hay ninguna manera de decir en WSDL que un elemento particular de un
mensaje SOAP representa una URI y que la URI apunta a un servicio Web. Por lo tanto
cada WSDL describe solo un recurso Web y no proporciona ningún método para
describir enlaces a otros recursos. SOAP y WSDL usan URI solo para direccionar un
punto final de gran importancia que gestiona todos los objetos dentro de el. Por
ejemplo, para enviar un mensaje a una cuenta en particular, debe hacerse algo como
esto:
bank = new SOAPProxy("[Link]
[Link](account 23423532, 50 dollars)
Para conseguir el balance asociado a una cuenta, debe hacerse algo como esto:
Hay que hacer notar que la cuenta por si sola no es directamente direccionable. No tiene
URI, solo un número de cuenta. Sólo se puede acceder a la cuenta a través del servicio.
También debemos darnos cuenta de que los números de cuenta del banco constituyen un
espacio de nombres, distinto del espacio de nombres de las URI de la Web. En la
versión del servicio centrada en la Web, las cuentas deberían ser individualmente
direccionables y cada una debería tener una URI.
Ahora vamos a hacer una analogía. Supongamos que estamos viviendo temporalmente
en un hotel. El hotel puede no tener conexiones telefónicas directas con el exterior. Para
llamar a una habitación debemos contactar con el operador primero (esto es como
contactar con el punto final de SOAP) y después pedir que nos conecten con la
habitación. Ahora imaginemos que hay un servicio externo al que queremos acceder. Es
un servicio automatizado de Horóscopo. Intentamos acceder al servicio pero cuando nos
preguntan el número de teléfono, nos damos cuenta de que no solo hay un número que
podamos proporcionar. El servicio debe contactar primero con el operador y después el
operador pasará la llamada hasta nosotros. Obviamente, un ordenador en el otro extremo
de la comunicación no es capaz de entender esto, y el operador no sabrá a quien pasar la
llamada.
Hay que darse cuenta de que el problema no es tan obvio en el diseño de cada sistema
por separado. Sólo cuando tratamos de unir ambos sistemas es cuando desearíamos
haber usado la sintaxis del estándar internacional de direccionamiento telefónico. Los
puntos finales de SOAP son como el operador. Los objetos con los que trabajan
(recibos, cuentas de banco) son las habitaciones del hotel. Los datos están a la merced
de los puntos finales de SOAP. Si las interfaces de los servidores y clientes no están
perfectamente alineadas, no se pueden comunicar. Una tercera parte que sea una
aplicación que intenta integrarlas, tendría que extraer explícitamente la información de
un servicio y ponerla en el otro. Esto no es una buena solución porque la tercera parte
tendría que ser la responsable del intercambio de información. Idealmente sería
preferible introducir los dos elementos de datos de tal manera que permitan a cada uno
ser informado de los cambios de estado del otro.
En contraste con esto, HTTP recomienda fuertemente el uso de URI como
identificadores. De hecho, la arquitectura Web anima a usar URI que puedan ser
resueltas en documentos. Comúnmente esto significa URIS “http:”. URI es el elemento
que unifica el concepto de HTTP. Podemos inventarnos nuestras propias cabeceras e
incluso en algunos casos nuestros propios métodos. Podemos usar cualquier tipo de
contenido en el cuerpo (o ninguno) pero siempre debemos enviar una URI como el
recurso objetivo de cada petición HTTP.
Esta elección tiene consecuencias reales. Si dos servicios HTTP se pueden poner de
acuerdo en la representación de una información (por ejemplo RSS o SAML) entonces
esos dos servicios pueden comunicarse sobre esos recursos de información simplemente
pasando URI a los recursos. Por ejemplo, si tenemos un documento RSS representando
la información de un blog, podemos introducirlo en un sistema de visionado de blogs
como Meerkat simplemente manejándolo como una URI. Meerkat no necesita saber
cual es el mecanismo de direccionamiento porque está estandarizado. Meerkat tampoco
necesita saber los métodos que usamos para conseguir la información porque el método
HTTP “GET” está implícito. También podemos imaginar el servicio contrario. Podemos
pedirle a Meerkat que use un RSS haciendo un PUT a una dirección que
especifiquemos.
Hay una razón para el fallo de SOAP en el direccionamiento. Si SOAP admitiese que la
sintaxis de direccionamiento para SOAP fuese URI, eso sería equivalente a decir que
SOAP está diseñado sólo para ser usado en la Web. Sin embargo, los defensores de
SOAP son muy claros en el hecho de que los protocolos Web y los modelos de
direccionamiento Web, solamente sirven como transporte para SOAP. La Web es un
conductor de taxi y su única función es llevar SOAP de un lado a otro. El mensaje
SOAP puede salir del taxi y entrar en otro vehículo para proseguir otra etapa de su viaje.
En términos técnicos, SOAP hace un túnel sobre la Web. Esto no es para lo que se
diseñó la Web.
La Web es un tipo de mundo unificado, global y donde todo el mundo mapea sus
sistemas con el mismo modelo, usando el mismo esquema de direccionamiento, un
reducido número de protocolos globales que todo el mundo entiende, formatos para la
información compartida y vocabularios XML. No tiene mucho sentido adoptar la parte
menos potente de la infraestructura Web (la sintaxis del método HTTP POST) e ignorar
la parte más potente: El espacio de nombres URI y el modelo de manipulación de
recursos estandarizados.
La relación entre REST y SOAP/WSDL es similar a la que existe entre XML y SGML.
XML era prescriptita: “debes usar Unicode”. SGML era descriptiva “puedes usar
cualquier carácter pero debes declararlo”. XML: “Debes usar URI para los
identificadores”. SGML “Puedes usar cualquier clase de identificador (nombre de
fichero, clave de la base de datos…)”.
SOAP ignora cosas que hemos aprendido de XML y la experiencia de la Web. Aún así,
SOAP continúa ganando adeptos en la industria y el comercio.
Los seguidores de REST deben ver SOAP como una pregunta más que como una
respuesta. La pregunta es “¿Cómo hacemos que la Web haga las cosas de los Servicios
Web? El hecho de que la gente sienta que necesita SOAP indica que no están
satisfechas con HTTP. Por tanto hay que evaluar las cosas que se supone que SOAP
añade a HTTP.
Hay algunos temas que surgen cuando los adeptos a REST hablan con los adeptos a
SOAP:
Asincronía:
Esto significa diferentes cosas para la gente, pero la acepción más común es que dos
programas que se comunican (por ejemplo cliente y servidor) no deben estar en
constante comunicación mientras que uno de ellos esté realizando cálculos de gran peso.
Debe haber alguna manera para que una parte de la comunicación pueda avisar a la otra.
SOAP no soporta esto directamente pero puede ser usado de una manera asíncrona si el
transporte que utiliza es asíncrono. Esto todavía no está estandarizado pero algún día lo
estará. Hay una gran variedad de aproximaciones para hacer HTTP asíncrono. Se ha
propuesto la estandarización, una de esas especificaciones es “HTTPEvents”.
Enrutamiento:
Los mensajes HTTP están enrutados desde los clientes hasta los servidores proxies. Esto
es un tipo de enrutamiento controlado por la red. También hay algunos casos en los que
tiene sentido que el cliente controle el enrutamiento explícitamente, definiendo el
camino que debe seguir un mensaje entre los nodos. Algunas investigaciones de REST
están trabajando con variantes del enrutamiento de SOAP para esto.
XML:
Fiabilidad:
La fiabilidad es otra palabra que significa diferentes cosas para la gente. Para la mayoría
de la gente significa entregar un mensaje una y solo una vez. Esto es relativamente fácil
de conseguir con HTTP, pero no es una característica implícita. Lo que podría decirse
que es peor es la cuestión de que la fiabilidad garantizada va en contra de las redes a
gran escala y tratar de conseguirla puede degradar el funcionamiento.
Seguridad:
SOAP tiene WSDL pero HTTP no tiene nada parecido porque REST es un modelo
centrado en documento. La descripción de servicios REST puede surgir de los lenguajes
esquemáticos y en particular de los lenguajes de esquema semántico como DAML.
También sería posible usar la siguiente versión de WSDL de manera adaptada como un
tipo de lenguaje de descripción para los recursos HTTP.
Familiaridad:
Las tecnologías de servicios Web están diseñadas para ser tan flexibles que podemos
usarlas siempre que estemos acostumbrados a programar. Los que no tienen experiencia
con la programación en red pueden usar las variantes de RPC y usar las funciones como
si fuesen locales. Los que tienen experiencia en el intercambio de mensajes, pueden usar
unidireccionalmente SOAP para envolver sus mensajes. Los defensores de REST
pueden usar una extensión de HTTP. Ninguno de esos tres grupos de programadores
podrá interoperar con los demás.
Mirando hacia el futuro, hay tres posibles futuros. En uno, las críticas de REST sobre
la filosofía de SOAP resultan ser incorrectas. El modelo de SOAP volvería a ser
suficientemente bueno y el uso de REST se limitaría a ser el hipertexto de la Web. En
un segundo escenario, la metodología de SOAP revelaría gradualmente sus defectos
hasta que fuesen intratables. REST o algo parecido se convertiría en la arquitectura
dominante y SOAP estaría relegado a tener un papel mucho menos importante. En el
tercer escenario, encontraríamos una manera de que ambas arquitecturas trabajasen
juntas. Cada una podría tratar diferentes problemas e incluso podrían interoperar.
¿Puede ganar un solo protocolo? Los negocios electrónicos van a necesitar algo más
que software orientado a RPC o a mensajes. Todos los negocios tendrán que
estandarizar sus modelos de direccionamiento y compartir una interfaz común con el
resto de negocios. SOAP no hace esto por si mismo, en este aspecto, hace más daño que
la ayuda que ofrece.
Para que los negocios puedan interoperar sin necesidad de programar manualmente los
enlaces con otros negocios, necesitarán estandarizar los protocolos antes que inventar
nuevos. Tendrán que estandarizar un modelo de direccionamiento antes que inventar
uno nuevo. REST propone un alto grado de estandarización. Los servicios Web estarán
estancados hasta que se estandaricen en una arquitectura unificada, y REST es esa
arquitectura. Si esto es cierto, entonces no importa si gana REST o SOAP, porque
SOAP viviría dentro de la arquitectura REST para servicios Web.
¿Pueden coexistir REST y SOAP? Recientemente SOAP ha tomado una dirección que
le acerca a REST, pero también conserva su núcleo basado en RPC. La cuestión por
tanto no es si SOAP y REST pueden coexistir. Pueden. Pero si la visión del mundo
basado en REST es correcta, entonces todo el proyecto SOAP/WSDL sería un error.
¿Por qué necesitamos un marco de trabajo de protocolos para tunelar nuevos protocolos
de aplicación sobre cualquier transporte, cuando tenemos muchos protocolos de
aplicación?
Una respuesta es que SOAP está ganando en cuanto a seguridad, enrutamiento y otros
aspectos que no pueden ser direccionados con HTTP, o por lo menos no tan
robustamente. Un escenario horrible para la futura Web tendría un conjunto de
características disponibles para SOAP (seguridad, enrutamiento…), y otro conjunto
distinto para HTTP (direccionamiento, métodos conocidos…), y ninguna manera de
conseguir lo mejor de ambos.
Una posible solución sería reinventar un protocolo REST (orientado a URI y genérico)
en lo alto de SOAP. Lo llamaremos “SHTTP”. Sería una solución potente pero existen
muchas dificultades técnicas. Dada una URI en particular, debe existir un y solo un
modo de mapear la URI en una representación. Por tanto, se requeriría un nuevo
esquema URI. Este nuevo esquema URI sería incompatible con la gran variedad de
clientes HTTP que hay desarrollados y podría tardar años en propagarse.
Además, HTTP se usa constantemente para repartir datos binarios, pero SOAP no es
bueno en ese aspecto. Los motores HTTP son más eficientes que las herramientas que
deben parsear XML. Hay otro problema por el que los mensajes SHTTP no podrían
correr en lo alto de SOAP, SOAP suele ir encima de HTTP. Esto es ineficiente, confuso
y puede desembocar en agujeros de seguridad donde el mensaje de la capa SHTTP es
muy distinto al que envía la capa HTTP.
Cada parte cree conocer las respuestas. Sólo el tiempo demostrará qué visión es la
correcta.
[Link] UN EJEMPLO
Es trivial excepto si el tráfico que cruza el firewall está codificado con SOAP. La
versión SOAP debe tener un paso de decodificación extra porque SOAP tiene (al
menos) tres maneras diferentes de transportar datos. Esto no sería un problema si SOAP
usara su propio puerto porque en ese caso sería fácil desactivar el puerto del mismo
modo que se hace con el de SSH o FTP. Desafortunadamente SOAP hace un túnel sobre
HTTP y sobrecarga este puerto.
Ahora digamos que seis meses antes estuvimos desarrollando una aplicación P2P para
compartir datos astronómicos. La llamaremos “starster”. Tenemos tres posibles
protocolos para usar. Una opción es usar un protocolo propio en un puerto propio. Esto
es correcto desde el punto de vista de la seguridad porque si al administrador no le
parece correcto el uso de este programa, puede ir al firewall y cerrar el puerto.
Una segunda opción es usar SOAP. En este caso, starster usará su propio protocolo
como una adaptación de SOAP (un conjunto de métodos de este) y SOAP hará un túnel
a través de HTTP. Esto significa que el administrador del sistema no podrá saber por
defecto si starster se está ejecutando en el sistema. Tampoco podrá evitar el uso de este
programa. Necesitaría detectar un espacio de nombres XML particular definido en un
documento XML particular y que va encapsulado en un sobre SOAP, que a su vez va
encapsulado en un mensaje HTTP sobre TCP.
Una tercera opción es usar HTTP, pero usándolo de acuerdo con la especificación
HTTP, sin codificaciones extra. En este caso el tráfico de starter continuaría fluyendo
por el firewall porque es indistinguible del tráfico Web. Pero lo más importante es que
sería tan seguro como el tráfico Web porque el administrador del sistema podría usar un
filtro de tráfico estándar para evitarse los problemas del virus.
SOAP no hace esta distinción. Cualquier método puede ser de lectura o de escritura.
Incluso WSDL no permite hacer esta distinción. De esta manera una potente
herramienta de filtrado no sirve de nada. En general, los administradores del sistema
pueden leer los ficheros de “log” de una gran variedad de servicios basados en HTTP
porque todos son parecidos: GET, PUT, POST, DELETE y URI. Por otra parte, SOAP
permite mostrar los mensajes casi de cualquier manera. Está diseñado para tener una
forma libre. Los mensajes de diferentes servicios pueden ser totalmente distintos.
Un ejemplo trivial, GET/getHistoricalStockQuotes?MSFT le dice a una persona
responsable en seguridad: “Ok, es un GET, aunque sea un virus no puede modificar el
servidor. Probablemente devuelva algún tipo de reporte del historial de cuota. Si hay un
túnel o un bug no es mi problema, será culpa del programador.”
Por supuesto que ambos son igual de simples: devuelven un reporte. Pero uno es muy
explícito al asegurar que no modificará el estado del servidor, mientras que el otro no.
Para nuestras intenciones, los protocolos de aplicación son para direccionar y manipular
datos y recursos. En la Web, todos los recursos forman parte de un sistema de
direccionamiento global, URI. Una de las cosas buenas de usar URI es que proporciona
una manera muy tangible para poner los permisos. Por ejemplo, podemos imaginar
como se dan o quitan los permisos de un fichero de una orden de compra, y sería
equivalente hacerlo con un recurso de orden de compra Web. Esta es una característica
Web estándar y tiene sus raíces en las técnicas de permisos que la gente ha usado
durante décadas.
La gran diferencia entre un recurso y un fichero es que el recurso es virtual: por ejemplo
puede estar representado por una fila en una base de datos. Los permisos los aplicamos
a la orden de compra virtual, no a un fichero.
La gente tiene una gran confianza depositada en el servidor Web Apache. IIS está
considerado menos robusto, pero lo suficiente como para tener millones de sitios
funcionando cada día. Consideremos el tiempo que tomó llevar a la seguridad hasta este
punto. De momento no podemos confiar en que las herramientas de servicios Web
hayan alcanzado este nivel de fiabilidad y seguridad. El mundo de los servicios Web
debe tomarse las cosas con más calma y considerar las implicaciones de la seguridad de
sus invenciones con mucho más rigor.
Pequeño resumen de lo que es REST y su relación con SOAP. Indica que una de las
cosas por las que REST no se está extendiendo rápidamente es la falta de promoción.
REST dice que SOAP-RPC no está bien diseñado para compartir datos basados en
XML u otros documentos sobre Internet de una manera eficiente porque esos estándares
no son más que una repetición de DCOM y CORBA con algunos cambios.
De acuerdo con los adeptos a REST, la Web ya tiene una arquitectura para sistemas
distribuidos que es robusta, segura y ampliamente probada. Está basada en formatos
comunes, un estándar de protocolos, y lo más importante, un sistema de nombres
estándar: URI.
Un sitio Web bastante importante, RESTwiki, describe por qué REST es tan bueno
para compartir en Internet los datos y las colecciones de documentos. “No importa que
servidor Web tenga, ni el cliente Web que acceda a él, si se ve una URL como
[Link] sabemos que podemos solicitar información usando
los métodos HTTP, sin necesitar ninguna coordinación previa. También podremos
manipular su contenido con PUT y POST (aunque nos responderán si es posible o no, y
las razones de esta decisión)”.
Una de las razones por las que REST no ha sido ampliamente aceptado todavía es que
nadie lo está promocionando. Aunque las ideas de REST llevan un par de años
rondando, no existe ni un consorcio REST, ni un estándar REST para desarrollar.
Simplemente representa una manera diferente de pensar acerca de los servicios Web,
aunque tiene las ventajas de que el funcionamiento, la seguridad y el espacio de
nombres llevan probándose en Internet desde hace años.
¿Se podría decir que es REST contra SOAP? No exactamente, dicen los seguidores de
REST. SOAP tiene un papel muy importante en el contexto de REST. Algunos adeptos
a REST no son muy optimistas sobre su futuro porque SOAP ha llegado a convertirse
en sinónimo de RPC, y la gente empieza a asociar servicios Web con SOAP.
Los adeptos a REST dicen que usando el protocolo SOAP para acceder a las funciones
de programas remotos directamente es un fallo del mismo tipo que los problemas de
interoperabilidad que sufrían las antiguas arquitecturas de programación distribuidas
como DCOM y Common Object Request Broker Architecture (CORBA).
Los problemas de seguridad también afectan a SOAP, dice Mark Baker, un consultor
independiente de arquitectura Web y uno de los administradores de un sitio de recursos
para desarrolladores. Como los firewall no comprenden el significado de los mensajes
de los servicios Web basados en SOAP, nunca dejaran pasar esos mensajes.
Los mensajes REST no tienen este problema, dice Baker, porque solamente usan
operaciones especificadas en el estándar HTTP (operaciones bien conocidas por los
administradores y las aplicaciones firewall). Los comerciantes Web están solucionando
este problema desarrollando estándares de seguridad en los servicios Web y productos,
de la misma manera que se desarrollan firewalls y estándares de seguridad para HTTP.
Antes de decidir usar REST para su servicio Web, Thomson consideró usar SOAP. Los
desarrolladores eligieron REST porque ofrecía un mejor funcionamiento, fiabilidad y
escalabilidad que SOAP.
Usando REST Thomson ahora puede usar documentos de datos de distinta fuente más
fácilmente. Thomson dijo: “Antes de usar esta tecnología, teníamos que escribir una
solución específica para cada fuente de datos, ahora lo podemos crear rápidamente
usando REST”.
La experiencia de los usuarios de REST ha sido tan prematura como positiva, pero hay
una gran carencia de herramientas. Esto es un gran obstáculo para la difusión. Todavía
no existen grandes desarrolladores de aplicaciones que hayan adoptado REST, aunque
parece que se lo están planteando seriamente. “REST tiene algunas grandes
características que estamos examinando.” Dijo David Orchard, director técnico de BEA.
Todavía hace falta que los diseñadores de herramientas adquieran un compromiso con
REST para que éste despegue totalmente. Productos como Microsoft's Visual
Studio .Net o IBM's WebSphere, automáticamente producen servicios Web basados en
SOAP.
Baker no está de acuerdo. Él dice que virtualmente cualquier herramienta HTTP podría
servir para desarrollar servicios Web REST. “Hay un montón de herramientas REST
disponibles, simplemente que la gente no sabe que existen”, el dijo.
Las mismas herramientas que crean los Java Servlets podría usarse para construir
servicios Web basados en REST, dijo Baker. “Siguen las especificaciones HTTP, y por
consiguiente, implícitamente están compliendo las restricciones del estilo REST”, el
dijo.
BEA sugirió que REST debería coexistir con SOAP algún día porque los
desarrolladores buscan múltiples técnicas para los estilos de servicios Web. “A veces
hay más de una manera de hacer las cosas”, él dijo.
Entrevista a Roy Hoobler en la que éste expresa su visión peculiar de REST. Desde su
punto de vista con REST podemos solicitar información y recibirla, pero ahí es donde
termina todo. Dice que de cara a realizar esta función, REST es mucho más sencillo y
útil que SOAP, pero no podemos realizar Servicios Web que precisen procesamiento de
datos.
¿Existe una manera simple de explicar REST?
Sí, viendo el ejemplo de Amazon. Si vamos a construir una aplicación XML, tendremos
un fichero XML en una máquina. Sin embargo, en la mayoría de las aplicaciones XML,
no tiene por qué ser el caso, porque podemos acceder al archivo XML a través de una
URL válida. Por ejemplo, podemos ir a una página Web, conseguir un fichero XML y
“parsearlo” en nuestro ordenador.
Si está en una base de datos, debe ser una base de datos local. No podemos conectarnos
directamente a la base de datos de Amazon y ellos no van a dejarnos. Por tanto, deben
tener un servicio SOAP, o deben realizar una búsqueda a través de HTTP, que es lo que
realmente están haciendo. Lo que están haciendo (con REST) es construir un
documento XML “al vuelo” y devolver así los datos vía HTTP. Podemos usar esa
información en el sistema, almacenarla y procesarla. Hay muchas cosas que podemos
hacer sin necesidad de SOAP ni de programar nada.
Es un proceso muy simple. Si alguien tiene un archivo XML y nos da la URL, entonces
podremos descargar el contenido. La programación queda prácticamente fuera. Alguien
puede subir un fichero de texto y yo puedo descargarlo a través del navegador. Es un
poco más complicado que eso, pero no demasiado.
SOAP es bastante lento comparado con REST, porque acarrea una mayor carga de
comunicación. Cuando usamos REST, estamos cogiendo información como si
estuviésemos buscando una página Web de un sitio. La conseguimos rápidamente. Con
SOAP, hay mucha más información transaccional detrás de cada operación.
Es una técnica. Otros sitios que la han usado mucho son los blogs. Ofrecen lo mismo,
pero usan un método llamado RSS (Resource Site Summary). Ofrecen casi lo mismo
pero está en formato RDF (Resource Site Summary), que es un formato XML. Por
ejemplo, si tenemos una lista de enlaces en nuestro sitio Web que queremos compartir
con alguien, todo lo que tenemos que hacer es proporcionarle una URL desde donde
puede descargar la información en RDF. Es algo parecido a lo que REST y Amazon
hacen. Es una suscripción de servicio barata. No hay que escribir un servicio Web,
simplemente vamos allí y cogemos el contenido.
Amazon usa actualmente un Servicio Web al estilo REST para compartir la información
del precio de los productos con sus compradores. ¿Qué debería hacer SOAP para
realizar la misma función?
No es tan potente. Con REST, solamente estás accediendo a contenido. No hay mucho
procesamiento. Podemos realizar operaciones mucho más complejas con SOAP. Si
Amazon necesitara enviar mucha información, y después hubiese que procesarla, SOAP
sería lo más recomendable. REST no ha calado en el mundo de los negocios porque
actualmente se necesitan grandes servidores de interacción y REST no es lo
suficientemente potente.
Un ejemplo de ello:
Si estamos usando REST, podemos ir a un sitio Web que proporciona una lista de venta
de tickets, pero no podemos modificar los tickets. Si estuviésemos usando SOAP,
podríamos manipularlos y enviar el resultado de nuestros cálculos. Digamos que
conseguimos los valores de un sitio, y queremos avisar de que son erróneos. Si
quisiésemos enviar de vuelta algo que dijese que es erróneo con REST, no podríamos.
Con REST podemos solicitar información y recibirla, pero ahí es donde termina todo.
¿Cómo de fácil o difícil resulta aprender a trabajar con REST respecto a SOAP?
Para trabajar con SOAP, necesitamos algún tipo de infraestructura como la de IBM o
Microsoft. Otros como Cape Clear ofrecen implementaciones SOAP, pero necesitamos
tener instalado todo el Software y conocer la infraestructura. Con REST, para visualizar
esa información en una página Web, hace falta conocer XML y XSLT. Muchas
plataformas (como Websphere y los servidores de aplicaciones Java) tienen esto
integrado o es fácil añadirlo.
Por otro lado, si queremos usar SOAP, tenemos que usar todo el marco de trabajo .NET
o usar Websphere Studio. Tendremos que usar una aplicación compleja, que se traduce
en una gran inversión de tiempo y dinero.
¿Cómo puede saber una compañía si debería usar REST en vez de SOAP?
En este artículo realiza un resumen de REST a la vez que lo compara con SOAP. Habla
de la flexibilidad de la interfaz y de la seguridad. También comenta cuando deja de ser
válido el modelo REST, y SOAP comienza a ser una buena opción.
REST es más una vieja filosofía que una nueva tecnología, mientras que SOAP parece
que da un salto a la siguiente fase del desarrollo de Internet con nuevas
especificaciones. La filosofía de REST expone que los principios y protocolos
existentes en la Web son suficientes para crear servicios Web robustos. Esto significa
que los desarrolladores que comprendan HTTP y XML pueden empezar a construir
servicios Web de una manera correcta, sin necesidad de otras herramientas
Cualquier cliente o aplicación del servidor con soporte HTTP podría llamar a este
servicio fácilmente con un comando HTTP GET. Dependiendo de cómo escribió el
script el proveedor del servicio, la respuesta HTTP podría ser tan simple como algunas
cabeceras estándar y una cadena de texto que contenga el precio actual. O podría ser un
documento XML.
Otro beneficio de la interfaz REST es que las peticiones y las respuestas pueden ser
cortas. SOAP requiere una envoltura XML para cada petición y respuesta. Una vez que
se ha declarado el espacio de nombres, la respuesta a una petición en SOAP puede
ocupar hasta diez veces más bytes que la misma respuesta en REST.
Los adeptos a SOAP argumentan que toda esta cantidad de bytes es una característica
necesaria de las aplicaciones distribuidas. En la práctica, la aplicación de petición y el
servicio conocen los tipos de datos antes de tiempo, por tanto, transferir esa información
en la petición y en la respuesta es gratuito.
Por otra parte, una petición SOAP típica usará POST para comunicarse con un servicio
dado. Sin mirar dentro del sobre SOAP, una tarea puede ser a la vez un recurso o un
consumidor. No existe ninguna manera de saber si la petición sólo quiere solicitar un
dato o borrar todas las tablas de una base de datos.
Esto no sólo es útil para los desarrolladores, hace más fácil la tarea de los
administradores, quienes pueden usar algo tan simple como un fichero ACL para
mantener sus servicios Web de igual manera que lo harían con otra URI.
Para ser justos, REST no es la mejor solución para todos los servicios Web. Los datos
que deben mantenerse seguros, no se pueden enviar como parámetros en las URI.
Además, grandes cantidades de datos, como los detalles de las órdenes de compra,
pueden hacerse rápidamente muy voluminosos e incluso desbordarse dentro de una
URI. En esos casos SOAP es una solución bastante consistente. Lo más importante es
tomar REST primero y usar REST sólo si es necesario. Esto ayuda a que el desarrollo
de aplicaciones sea simple y accesible.
Este artículo es un breve resumen de las diferencias entre recursos (REST) y servicios
(SOAP). Al final del artículo, expone las carencias de cada uno respecto al otro REST –
SOAP = XLink y SOAP – REST = Procedimientos almacenados.
La diferencia más grande entre los dos modelos se encuentra en el nombre del recurso.
En REST, el recurso está identificado por medio de Uniform Resource Identifiers
(URI). Mientras que SOAP descarta esta posibilidad, la mayoría de los servicios SOAP
no se diseñan de esta manera.
Tim Bray es un desarrollador de Software, fue la persona que más contribuyó a formar
los estándares XML y Atom. También es un empresario (cofundó Open Text
Corporation y Antarctica Systems). Actualmente Tim es el director de tecnologías Web
de Sun Microsystems.
Artículo en el que comienza dando unas nociones de los métodos GET y POST para
después pasar a explicar con un ejemplo las discrepancias entre REST y SOAP a la hora
de su puesta a punto. Tim Bray asocia GET con REST y POST con SOAP.
Un fragmento de Software que quiere hablarle a un servidor Web (un navegador por
ejemplo, aunque hay muchos otros), generalmente usa el protocolo HTTP, que soporta
todas las clases de transacciones, las más usadas son GET y POST.
GET es simple: enviamos una petición codificada en una URI al servidor, y obtenemos
de vuelta del servidor un paquete de información. Esto es lo que ocurre cuando hacemos
clic en un hiperlink; nada puede ser más fácil, la gran mayoría de las transacciones Web
son GET. Hay más reglas que acompañan a GET, no está bien usarlo para hacer una
compra o cualquier cosa que haga cambiar el estado. Es sólo para solicitar información.
¿Cómo hacemos que esto encaje en el mundo GET/POST? Hacemos notar que
normalmente enviamos desde el servidor XML orientado a una máquina antes que
HTML orientado a humanos. Si hacemos una petición con un POST, el paquete de
información que enviamos normalmente es XML también.
Realmente si. Lo primero de todo, si vamos a hacer algo que necesita algo más que
solicitar información, debemos usar POST. Si por el contrario solo vamos a solicitar
información, debemos usar GET, incluso si pudiésemos usar POST.
La razón de usar este método es que el parámetro de entrada de GET es una URI, así de
simple, una maravillosa cadena de caracteres puede ser usada para direccional cualquier
cosa en la Web, lo que más o menos es todo en estos días. Esto significa que podemos
mandar un e-mail a esa URI, o llevarla a un motor de búsqueda, o almacenarla en el
bookmark, o hacer una serie de cosas que probablemente todavía no se hayan inventado.
Esto también significa que los elementos como caches y proxies pueden realizar su
trabajo más rápidamente y por consiguiente hacer la Web más rápida.
[Link] REST
A la gente (como el W3C TAG) que trata de promover el uso de GET, se les dice que
son discípulos de REST. REST es un acrónimo inventado por Roy Fielding que forma
parte de la fundación Apache y fue uno de los autores de la especificación URI. Lo
inventó para su tesis en la que trataba de formalizar la manera de trabajar de la Web.
Por otra parte, hay bastante gente acostumbrada a pensar en forma de complicadas
estructuras de datos y complejas APIs. Esta gente tiende a pensar que GET es
demasiado simple, inflexible y poco sofisticado. Están en lo cierto puesto que en los
casos en los que solicitamos información es cuando entra en juego la ventaja de
nombrar con URI, lo que hace que las transacciones con GET sean tan sumamente
simples.
La gente que no está de acuerdo tiende a usar POST; prefieren codificar un paquete que
contiene argumentos con una complicada API, en algunos casos como complicadas
estructuras de datos, enviándolas y recibiendo de nuevo más estructuras de vuelta. Esta
visión está fuera de la semántica Web en términos de ser una realidad práctica y útil.
El conflicto entre REST y SOAP/XML-RPC fue sacado a la luz por Paul Prescod,
cuando escribió acerca del camino que estaba tomando Google. Fue una primera vista
de los temas a tratar.
Hay dos niveles de protocolos de bajo nivel que podemos usar para enviar (POST),
SOAP y XML-RPC. SOAP, que creció del trabajo de Dave Winer y Microsoft, es
bastante complejo y sobre-equipado para lo que debería ser una simple tarea, aunque
también existen buenas implementaciones. XML-RPC desarrollado casi entero por
Dave, es por el contrario demasiado simple y poco equipado, incluso para lo que debería
ser un trabajo simple, aunque también existen buenas implementaciones.
Dave Winer señaló que sería más fácil para los programadores con herramientas XML-
RPC o SOAP conseguir esto vía POST si la interfaz fuese SOAP o XML-RPC.
También señaló que es realmente poco útil que la URI tuviese que incluir un “appkey”
(es una marca que da acceso a usar el servicio. Hay un límite de veces que se puede usar
al día, excepto si pagamos dinero).
Realmente la postura de Dave Winer no es buena del todo (para no crear confusión
entre ambos Daves, les llamaremos DW y DS). Como primer punto diremos que, esto es
una aplicación al más puro estilo dame-algo-de-información, y construir las URI genera
un poco más de trabajo, pero conseguimos que los resultados de Technorati sean
ciudadanos de primera clase dentro de la Web y estén representados por cadenas cortas.
Obviamente si queremos construir una aplicación para enviar dinero a DS por usar su
servicio, querremos enviar vía POST XML-RPC o algo equivalente.
¿Compensa usar la potencia de nombrar todo con URIs teniendo en cuenta los
inconvenientes de tener que introducir complejas peticiones en ellas? ¿Compensa la
opción de empaquetar las peticiones en XML con el inconveniente de perder la potencia
de nombrado?
Este artículo no compara REST directamente con SOAP sino con la Orientación a
Objetos (OO). Explica los comienzos y orígenes de REST y OO. En cuanto al tema
concreto de REST, este autor tiene una visión un poco particular de REST en términos
de propiedades.
Las URIs son muy parecidas a los OIDs (punteros, referencias, o similares). Son cosas
que se pueden dereferenciar para conseguir el recurso que buscamos, por tanto, no son
comparables con las ideas de espacio de nombres global o variable local. Esto es una
importante distinción de la que todavía no sabemos sus repercusiones.
[Link] SIMILITUDES
Desde nuestra perspectiva, los conceptos de Orientación a Objetos (OO) y REST son
comparables. Ambos buscan identificar “cosas” que corresponden a algo que
conocemos y con lo que interactuamos. En OO lo llamamos objeto. En REST lo
llamamos recurso. OO y REST permiten algunas formas de abstracción. Podemos
reemplazar un objeto por otro de la misma clase o del mismo tipo sin cambiar la manera
en que el código del cliente interactúa con el objeto. El tipo es una abstracción común
que representa cualquier objeto que encaje igual de bien. Podemos reemplazar un
recurso por otro sin cambiar la manera en que los clientes interactúan con él. Los
recursos son conceptos ligeramente menos pesados que los objetos, cuando hablamos de
recursos normalmente necesitamos mencionar el espacio URI (el espacio de nombres de
los recursos). Los clientes pueden interactuar con un nuevo software de servidor a través
de sus recursos de la misma manera que interactuaban con el viejo software del
servidor. Los recursos que se presentan representan a ambos igual de bien.
[Link] DIFERENCIAS
REST dice que el espacio de nombres debería ser lo más importante. Cada objeto que
pueda contactar con otro objeto debe tener un nombre. No cualquier nombre, un nombre
globalmente accesible. Si llevamos esto al extremo, cada objeto que pueda ser accesible
desde otro objeto debe ser también accesible desde cualquier lugar del mundo por un
identificador único y global:
En principio, cada objeto que alguien pueda querer o necesitar para citarlo debe tener
una dirección que no conduzca a ambigüedades.
[Link] HISTORIA
La historia que vamos a describir puede decirse que está fundamentada en rumores más
que explicar exactamente como emergió cronológicamente cada aspecto. Podemos
seguir la ruta de la historia de la OO desde la práctica de la programación estructurada.
En la programa programación estructurada usamos muchos bucles “for” y “while”.
Atajamos un problema pensando en los pasos que debemos seguir para ejecutar la
solución. En aquellos tiempos era difícil mantener estructuras de datos, porque a
menudo significaba tener que mantener grandes cantidades de código base. Una
implementación con listas enlazadas necesitaba insertar el código de la operación
muchas veces, de manera que cuando cambiábamos de lista simplemente enlazadas a
doblemente enlazadas era difícil asegurarnos de que todo el código seguía funcionando
correctamente. Esto necesitó de la abstracción para conducirnos a la noción de Tipos de
datos abstractos (ADTs).
ADT fue un gran hito. Definiendo un conjunto de operaciones legales en una estructura
de datos y manteniendo todo el código en su lugar, podíamos reducir los costes de
mantenimiento y manejar la complejidad. ADT se convirtió en una abstracción que
podía representar diferentes implementaciones igual de bien. Las ventajas fueron tan
importantes, que los detalles de las implementaciones subyacentes como las variables
miembro se escondieron al código del cliente. Evitar fallos en la disciplina de la
programación fue un gran enfoque.
La orientación a objetos se presenta cuado decimos “Esto funciona tan bien, ¿Por qué
no lo aplicamos a estos conceptos?” En vez de aplicar la técnica solo a las estructuras de
datos, encontramos que podemos aplicarlo siempre que necesitemos abstracción.
Podríamos aplicarlo a algoritmos o a cualquier cosa conceptualmente abstracta.
Desarrollamos patrones de diseño con intención de explicar a los demás como usar
objetos para resolver problemas.
Esto es un paso significativo desde un modelo orientado a objetos hasta lo que es REST.
Dejaremos de lado la implementación de serializable que permite almacenar, transmitir
y desempaquetar una representación en el otro extremo. También dejaremos de lado el
constructor por defecto. Lo que consideraremos realmente importante es el uso de las
propiedades, o como podríamos llamarlas: Recursos.
Es mucho más fácil tratar con un conjunto (“real” o de otro tipo) de propiedades que
tratar con llamadas a funciones. Los seres humanos encontrarán más fácil tratar con esos
objetos. Incrementando la presencia de objetos en el espacio de nombres y definiendo
un conjunto de operaciones que pueden ser usadas con cada elemento presente en ese
espacio de nombre, conseguimos un aumento de la facilidad en el trato con cada
elemento. No perdemos ninguna abstracción de las que ganamos al cambiar a ADT, en
primer lugar porque ahora esas propiedades no están revelando la implementación
interna de nuestro objeto. Están formando parte de la interfaz. Cuando configuramos
esas propiedades o las conseguimos, el código todavía se esconde a la hora de hacer lo
que los objetos eligen. El conjunto de propiedades puede representar diferentes tipos de
objetos igual de bien.
Esto es un ejemplo del triángulo que forman los verbos y tipos de contenidos para ir
hacia los nombres. Parece ser más importante conocer como se llama algo que el tipo de
datos que es. Este resultado no es obvio desde los primeros principios.
Cualquier código que acceda a este nombre, verbo y tipo de contenido operará
simplemente usando hiperlinks. Podemos elegir abrir el acceso a otros espacios URI,
como hace HTTP y los esquemas de ficheros. De esta manera podemos hacer hiperlinks
desde y hacia esos espacios sin alterar el significado de código del cliente.
Disenchanted dictionary es una página Web donde los autores cuelgan artículos de
manera anónima. En este sitio se pueden encontrar artículos relacionados con el mundo
de los Servicios Web.
Este artículo realiza una comparación entre REST y SOAP en cuanto a flexibilidad y
complejidad.
Cualquier página Web a la que miremos, está representando algún dato. Esto significa
un estado específico, y se transfiere al navegador cuando hacemos una petición de un
recurso disponible a una determinada dirección (algo como
[Link] REST es una manera de
describir como cada petición de una página Web en Internet funciona, pero también es
una manera de construir servicios Web.
REST compite en el nivel más alto con SOAP, un protocolo de llamada a procedimiento
remoto que trata los servicios remotos como funciones que se invocan con argumentos.
REST puede llegar a hacer lo mismo que SOAP, pero siguiendo un modelo diferente.
En vez de tratar los servicios remotos como programas que corren y necesitan
argumentos, REST solo conoce los recursos por su URI. La diferencia con la que cada
modelo trata los recursos remotos implica algunas ventajas para REST.
Con SOAP, se espera que un programa corra en una máquina remota cada vez que se
llama a una función, lo que se devuelve se crea momentos antes de usarse. REST no
asume eso, sólo conoce que hay algún dato en una dirección. La dirección apunta al tipo
de datos que quiere y al estado en el que debe estar. Es como la diferencia entre pedir a
una secretaria que calcule una factura (SOAP) o pedirle simplemente que la devuelva
(REST).
Esta es la ventaja que tiene REST sobre SOAP. La URI que copiamos en el navegador
Web (u otra aplicación) define exactamente lo que queremos y el estado en que lo
queremos (como puede ser el tiempo en Nueva York el dia 1 de Abril de 1999). Si para
darnos este dato el servidor tiene que ejecutar un programa que genere la información
“al vuelo”, o simplemente la recupera de un fichero creado años antes, es algo que no
inmiscuye ni la red ni a la persona que se ocupa de configurar el servidor. Con SOAP
esto no es posible, y probablemente nunca lo será, porque el paquete SOAP es más
complejo. SOAP hace difícil saber si un dato ha sido calculado antes cuando ejecutamos
un simple programa de recogida de datos.
REST es más simple, pero depende de HTTP como protocolo que envía peticiones en
una dirección y datos en la otra. Esto podría ser una ventaja porque HTTP tiene un
grupo de funciones diseñadas y testadas, como la autenticación y el mantenimiento de
recursos, mientras que cualquier cosa construida en SOAP necesita reinventar todo eso.
También puede ser una desventaja. SOAP puede hacer un túnel sobre cualquier
protocolo, no solo HTTP (podemos enviar paquetes SOAP por e-mail, por ejemplo, si el
retraso no es un problema en nuestra aplicación). Con SOAP, la petición puede ser más
sofisticada; por ejemplo, puede codificar tipos de datos.
6.9 Conclusiones
En este capítulo se ha dado una visión general del debate que ha existido en la Web
entorno a la comparación entre REST y SOAP. Se han expuesto los artículos más
relevantes que se han escrito hasta el momento. En el siguiente capítulo se comentarán
algunos de los Servicios Web que están actualmente funcionando de acuerdo al modelo
de arquitectura REST.
7 IMPLEMENTACIONES
En este capítulo se comentan algunos de los Servicios Web que están actualmente
funcionando de acuerdo al modelo de arquitectura REST. Además se proporciona un
ejemplo para comprender mejor el diseño de un Servicio Web y se incluye un artículo
que enumera los principales errores de implementación.
Uno de los pasos más grandes que se han dado es la creación de Restlet, una API que
nos permite implementar los Servlets de Java siguiendo el estilo REST. La principal
ventaja de Restlets es que permite programar Servicios Web de carácter general, no está
diseñado para un Servicio en particular (como ocurre con las API de Amazon o eBay).
7.1.1 Amazon
Amazon es una empresa muy potente en el campo de la venta online. Se podría decir
que fue uno de los pioneros en el uso de Servicios Web REST.
Su funcionamiento se basa en la esencia de REST. Posee una base de datos con todos
los detalles de los productos que vende. Cuando un usuario quiere realizar una búsqueda
o acceder a la información de determinados productos en particular, accede
directamente a los recursos solicitados y no a métodos remotos.
El hecho de que una empresa tan importante se haya decantado por el uso de REST
apoyó bastante al despegue de esta tecnología. El nombre de Amazon ha estado bastante
ligado al debate sobre REST que existe en la red. Muchos de los autores que se han
expuesto lo han usado como ejemplo en sus artículos.
Sin embargo, existe un aspecto que ha sido bastante criticado sobre la API de Amazon.
Solamente usa uno de los cuatro métodos HTTP, que es GET. Por lo que no se puede
decir que use todo el potencial de REST. La crítica a Amazon [12] alega que cuando
Amazon necesite realizar Servicios Web más complejos, no le bastará con usar el resto
de métodos, sino que necesitará migrar a SOAP.
7.1.2 eBay
En 2004 eBay sacó a la luz una API basada en REST a disposición de los clientes [24].
La interfaz de programación de aplicación REST (REST API) de eBay es una manera
sencilla de integrar la funcionalidad de eBay en una página Web o una aplicación. La
API REST permite usar una llamada, GetSearchResult, para obtener información sobre
los productos de eBay. La información devuelta por la llamada a GetSearchResult está
en formato XML. Además de usar GetSearchResult para obtener información sobre los
productos de eBay, se permite el procesamiento que transforma los resultados de la
búsqueda usando ficheros XSL que se suban. Se accede al fichero XSL subido usando
un link de la página central de desarrolladores REST ([Link]
Aquí se expone un ejemplo de llamada que usa la API REST. Los parámetros usados
como CallName, son parámetros de entrada específicos de la API REST
[Link]
=xyz123&RequestUserId=ebayuser&Query=toy%20boat&Schema=1
Como se puede observar, esta API viola una de las restricciones de REST. eBay nos
ofrece GetSearchResult que es un método remoto al que se le pasan argumentos. Esta
práctica va en contra de REST. eBay debería proporcionar recursos a los que acceder y
no métodos. Dicho de otra manera, debería ofrecer nombres y no verbos.
7.1.3 Restlets
Esto nos llevó a desarrollar nuestro propio marco de trabajo REST encima de la API
Servlet. Llegó a un punto en el que la API Servlet estaba completamente oculta.
Hicimos una separación entre la implementación del protocolo HTTP y el soporte para
la API Servlet. Al final, estábamos preparados para desarrollar el primer conector
Restlet, un conector de servidor HTTP que permitía llamadas uniformes REST.
Después de varios intentos, estuvo claro que sería beneficioso para los desarrolladores
separar el proyecto Restlet en dos partes.
La primera parte es un conjunto genérico de interfaces llamada Restlet API, que
incluye algunas clases de ayuda y mecanismos para registrar una
implementación Restlet.
Parts Depot, Inc (una compañía ficticia) ha desarrollado un Servicios Web para permitir
a sus clientes;
Conseguir una lista de partes (productos)
Conseguir información detallada de una parte en particular
Emitir una orden de compra (Purchase Order, PO)
El servicio Web hace disponible una URL para un recurso de lista de partes. Por
ejemplo, un cliente podría usar esta URL para conseguir la lista de partes:
[Link]
Debemos darnos cuenta de que la manera en que el servicio Web genera la lista de
partes es completamente transparente al cliente. Todos los clientes conocen que si
acceden a esa URL, entonces se les devuelve un documento que contiene la lista de las
partes. Como la implementación es transparente a los usuarios, Parts Depot es libre de
modificar la implementación subyacente de este recurso sin que esto tenga un impacto
en los clientes.
El servicio Web hace disponible una URL para cada recurso parte. Un cliente solicita
por ejemplo la parte 00345 de la siguiente manera:
[Link]
<?xml version="1.0"?>
<p:Part xmlns:p="[Link]
xmlns:xlink="[Link]
<Part-ID>00345</Part-ID>
<Name>Widget-A</Name>
<Description>This part is used within the frap assembly</Description>
<Specification xlink:href="[Link]
<UnitCost currency="USD">0.10</UnitCost>
<Quantity>10</Quantity>
</p:Part>
De nuevo, debemos observar cómo estos datos enlazan a más datos. La especificación
para estos datos puede encontrarse a través del hiperlink. Cada documento de respuesta
permite al cliente seguir explorando para conseguir información más detallada.
7.2.3 Emitir una PO (orden de compra)
El servicio Web hace disponible una URL para emitir una PO. El cliente crea un
documento de instancia de PO que es conforme al esquema de PO que Parts Depot ha
diseñado (y ha hecho público en un documento WSDL). El cliente envía [Link] como
la carga de un mensaje HTTP POST.
En este apartado se incluye un artículo de Paul Prescod [10] en el que se enumeran los
principales errores a la hora de implementar Servicios Web al estilo REST.
Cuando se diseña el primer sistema REST, hay varios errores que la gente comete a
menudo. En este artículo se van a resumir para que la gente pueda evitarlos.
5. Los servicios son raramente recursos. En el diseño REST, un servicio que nos
proporcione una cuota que indica el stock de unos determinados artículos no es
muy interesente. En vez de eso, en un diseño REST deberíamos tener recursos
“stock” y un servicio sería un índice de los recursos “stock”.
Lo más importante de todo es tener en la mente que REST trata de exponer recursos por
medio de URIs, no servicios a través de interfaces de mensajes.
7.4 Conclusiones
En este capítulo se han expuesto algunos de los Servicios Web que están actualmente
funcionando de acuerdo al modelo de arquitectura REST. Además se han proporcionado
un ejemplo para comprender mejor el diseño de un Servicio Web y un artículo que
enumera los principales errores de implementación.. En el siguiente capítulo se hará un
seguimiento de la relevancia que ha tenido REST en la Web desde que salió a la luz.
Además se intentará dar una previsión del futuro que le espera a REST.
8 EVOLUCIÓN Y FUTURO DE REST
En este capítulo se hace un seguimiento de la relevancia que ha tenido REST en la Web
desde que salió a la luz. Además se intenta dar una previsión del futuro que le espera a
REST.
Los adeptos a REST siempre han presumido de que la mayor parte de la red (las páginas
Web), hace uso de un diseño REST. Sin embargo, cuando hablamos de implementar
Servicios Web con una mínima complejidad, a día de hoy, SOAP posee el monopolio
casi absoluto. Las implementaciones que hay realizadas en REST van aumentando a
paso lento, por lo que el futuro que le espera es aún algo incierto.
Al terminar el año 2002 hubo un silencio casi sepulcral en la red. Es difícil encontrar
información sobre REST fechada en 2003 o 2004. Puede que la guerra de Irak tuviese
algo que ver con todo esto, por una posible desviación de fondos del sector académico
al militar (la mayor parte de los autores que han escrito sobre REST son
estadounidenses).
A partir del año 2005 vuelve a reanudarse el debate en torno a REST, aunque de una
manera más débil que en 2002 y sin aportar grandes cambios a todo lo que se había
discutido en los años anteriores.
A continuación podemos ver la Figura [28], que es una gráfica que expresa en tantos por
cien la cantidad de información que se generó sobre REST en un determinado año, en
relación a toda la documentación existente.
En este apartado vamos a incluir una parte del artículo que escribió Paul Prescod [25] en
2002 (que se encuentra en el apartado DEBATE REST-SOAP), pero que debido al
estancamiento que sufre REST, podemos decir que todavía es actual.
[Link] MIRANDO HACIA EL FUTURO
Hay tres posibles futuros. En uno, las críticas de REST sobre la filosofía de SOAP
resultan ser incorrectas. El modelo de SOAP volvería a ser suficientemente bueno y el
uso de REST se limitaría a ser el hipertexto de la Web. En un segundo escenario, la
metodología de SOAP revelaría gradualmente sus defectos hasta que fuesen intratables.
REST o algo parecido se convertiría en la arquitectura dominante y SOAP estaría
relegado a tener un papel mucho menos importante. En el tercer escenario,
encontraríamos una manera de que ambas arquitecturas trabajasen juntas. Cada una
podría tratar diferentes problemas e incluso podrían interoperar.
Los negocios electrónicos van a necesitar algo más que software orientado a RPC o a
mensajes. Todos los negocios tendrán que estandarizar sus modelos de
direccionamiento y compartir una interfaz común con el resto de negocios. SOAP no
hace esto por si mismo, en este aspecto, hace más daño de la ayuda que ofrece.
Para que los negocios puedan interoperar sin necesidad de programar manualmente los
enlaces con otros negocios, necesitarán estandarizar los protocolos antes que inventar
nuevos. Tendrán que estandarizar un modelo de direccionamiento antes que inventar
uno nuevo. REST propone un alto grado de estandarización. Los servicios Web estarán
estancados hasta que se estandaricen en una arquitectura unificada, y REST es esa
arquitectura. Si esto es cierto, entonces no importa si gana REST o SOAP, porque
SOAP viviría dentro de la arquitectura REST para servicios Web.
Recientemente SOAP ha tomado una dirección que le acerca a REST, pero también
conserva su núcleo basado en RPC. La cuestión por tanto no es si SOAP y REST
pueden coexistir. Pueden. Pero si la visión del mundo basado en REST es correcta,
entonces todo el proyecto SOAP/WSDL sería un error. ¿Por qué necesitamos un marco
de trabajo de protocolos para tunelar nuevos protocolos de aplicación sobre cualquier
transporte, cuando tenemos muchos protocolos de aplicación?
Una respuesta es que SOAP está ganando en cuanto a seguridad, enrutamiento y otros
aspectos que no pueden ser direccionados con HTTP, o por lo menos no tan
robustamente. Un escenario horrible para la futura Web tendría un conjunto de
características disponibles para SOAP (seguridad, enrutamiento…), y otro conjunto
distinto para HTTP (direccionamiento, métodos conocidos…), y ninguna manera de
conseguir lo mejor de ambos.
Una posible solución sería reinventar un protocolo REST (orientado a URI y genérico)
en lo alto de SOAP. Lo llamaremos “SHTTP”. Sería una solución potente pero existen
muchas dificultades técnicas. Dada una URI en particular, debe existir un y solo un
modo de mapear la URI en una representación. Por tanto, se requeriría un nuevo
esquema URI. Este nuevo esquema URI sería incompatible con la gran variedad de
clientes HTTP que hay desarrollados y podría tardar años en propagarse.
Además, HTTP se usa constantemente para repartir datos binarios, pero SOAP no es
bueno en ese aspecto. Los motores HTTP son más eficientes que las herramientas que
deben parsear XML. Hay otro problema por el que los mensajes SHTTP no podrían
correr en lo alto de SOAP, SOAP suele ir encima de HTTP. Esto es ineficiente, confuso
y puede desembocar en agujeros de seguridad donde el mensaje de la capa SHTTP es
muy distinto al que envía la capa HTTP.
Cada parte cree conocer las respuestas. Sólo el tiempo demostrará qué visión es la
correcta.
Puede que una de las causas por las que REST no termina de despegar los suficiente
como para hacerle sombra a SOAP sea la falta de organización y la escasez de
documentación útil.
Si alguien quiere desarrollar su primer Servicio Web al estilo REST, primero leerá la
disertación de Roy Fielding para posteriormente investigar sus dudas por la red. Pero lo
más probable es que esta persona no saque una idea en claro y decida desarrollar su
Servicio Web con otra tecnología.
9 TEMPORIZACIÓN Y PRESUPUESTO
En este capítulo se detalla el tiempo que se ha tardado en realizar el proyecto y se
desglosan los gastos que se derivan de él.
9.1 Temporización
Una tercera fase en la que había que traducir al castellano toda la información.
La duración total del proyecto ha sido de ocho meses. La primera fase se ha extendido
desde Noviembre hasta mediados de Abril. La segunda desde Noviembre hasta finales
de Abril. La tercera desde mediados de Noviembre hasta la mitad de Abril. La cuarta
desde Febrero hasta mediados de Junio.
9.2 Presupuesto
Subtotal 11250 €
Tabla 9 Costes de personal
Subtotal 263,9 €
El coste de Hardware ha sido el derivado del uso de un ordenador portátil, por lo que el
importe asciende a:
Subtotal 1200 €
Esta clasificación engloba al resto de gastos que no han sido incluidos en los otros
apartados. El importe de estos costes se desglosa de la siguiente manera:
Descripción Coste
Costes de Personal 11250 €
Coste software 263,9 €
Coste hardware 1200 €
Otros costes 110 €
Total 12823,9 €
[Link]
[Link]
questions/
[Link]
[Link]
node=1837&context=1633
[W3C-XML]: [Link]
[W3C-SOAP]: [Link]
T. Berners-Lee, R. Cailliau, and J.-F. Groff. World Wide Web. Flyer distributed at
the 3rd Joint European Networking Conference, Innsbruck, Austria, May 1992.
M. Fridrich and W. Older. Helix: The architecture of the XMS distributed file
system. IEEE Software, 2, May 1985, pp. 21–29.