Un canario en una mina de carbón.
Llevo casi un año esperando una pregunta como esta. Era inevitable que este día llegara y estoy seguro de que veremos muchas más preguntas como esta en los próximos meses.
Las señales de advertencia
Tiene toda la razón, lleva más tiempo construir clientes RESTful que clientes SOAP. Los kits de herramientas SOAP eliminan gran cantidad de código repetitivo y hacen que los objetos proxy del cliente estén disponibles casi sin esfuerzo. Con una herramienta como Visual Studio y una URL de servidor, puedo acceder a objetos remotos de complejidad arbitraria, localmente en menos de cinco minutos.
Los servicios que devuelven application / xml y application / json son muy molestos para los desarrolladores de clientes. ¿Qué se supone que debemos hacer con ese conjunto de datos?
Afortunadamente, muchos sitios que ofrecen servicios REST también proporcionan un montón de bibliotecas de clientes para que podamos usar esas bibliotecas para obtener acceso a un montón de objetos fuertemente tipados. Aunque parece un poco tonto. Si hubieran usado SOAP, podríamos haber codificado esas clases proxy por nosotros mismos.
JABÓN por encima, ja. Es la latencia lo que mata. Si la gente está realmente preocupada por la cantidad de bytes en exceso que atraviesan el cable, entonces quizás HTTP no sea la opción correcta. ¿Has visto cuántos bytes utiliza el encabezado de agente de usuario?
Sí, ¿alguna vez has intentado usar un navegador web como herramienta de depuración para cualquier cosa que no sea HTML y JavaScript? Confía en mí, es una mierda. Solo puede usar dos de los verbos, el almacenamiento en caché se interpone constantemente, el manejo de errores traga tanta información, está constantemente buscando un maldito favicon.ico. Sólo disparame.
URL legible. Solo sustantivos, no verbos. Sí, eso es fácil siempre que solo hagamos operaciones CRUD y solo necesitemos acceder a una jerarquía de objetos de una manera. Desafortunadamente, la mayoría de las aplicaciones necesitan un poco más de funcionalidad que eso.
El desastre inminente
Hay una carga métrica de desarrolladores que actualmente desarrollan aplicaciones que se integran con los servicios REST que están en el proceso de llegar al mismo conjunto de conclusiones que usted tiene. Se les prometió simplicidad, flexibilidad, escalabilidad, capacidad de evolución y el santo grial de la reutilización fortuita. Las características de la web en sí, cómo pueden salir mal las cosas.
Sin embargo, están descubriendo que el control de versiones es un problema, pero el compilador no ayuda a detectar problemas. El código del cliente escrito a mano es difícil de mantener a medida que las estructuras de datos evolucionan y las URL se refactorizan. Diseñar APIs alrededor de sustantivos y cuatro verbos puede ser realmente difícil, especialmente cuando los fanáticos de la URL RESTful te dicen cuándo puedes y no puedes usar cadenas de consulta.
Los desarrolladores comenzarán a preguntarse por qué estamos desperdiciando nuestro esfuerzo en admitir los formatos Json y Xml, ¿por qué no centramos nuestros esfuerzos en uno y lo hacemos bien?
¿Cómo salieron las cosas tan mal?
Te diré lo que salió mal. Como desarrolladores, dejamos que los departamentos de marketing aprovechen nuestra debilidad principal. Nuestra eterna búsqueda de la bala de plata nos cegó a la realidad de lo que realmente es REST. En la superficie, REST parece tan fácil y simple. Nombra tus recursos con Urls y usa GET, PUT, POST y DELETE. Demonios, los desarrolladores ya sabemos cómo hacerlo, hemos estado tratando con bases de datos durante años que tienen tablas y columnas y declaraciones SQL que tienen SELECT, INSERT, UPDATE y DELETE. Debería haber sido pan comido.
Hay otras partes de REST que algunas personas discuten, como la autodescripción y la restricción hipermedia, pero estas restricciones no son tan simples como la identificación de recursos y la interfaz uniforme. Parece agregar complejidad donde el objetivo deseado es la simplicidad.
Esta versión diluida de REST se validó en la cultura del desarrollador de muchas maneras. Se crearon marcos de servidores que fomentaron la identificación de recursos y la interfaz uniforme, pero no hicieron nada para soportar las otras restricciones. Los términos comenzaron a flotar alrededor de diferenciar los enfoques (HI-REST vs LO-REST, Corporate REST vs Academic REST, REST vs RESTful).
Algunas personas gritan que si no aplica todas las restricciones no es REST. No obtendrá los beneficios. No hay medio descanso. Pero esas voces fueron etiquetadas como fanáticos religiosos que estaban molestos porque su precioso término había sido robado de la oscuridad y se había generalizado. Las personas celosas que intentan hacer que REST suene más difícil de lo que es.
REST, el término, definitivamente se ha convertido en la corriente principal. Casi todas las principales propiedades web que tienen una API admiten "REST". Twitter y Netflix son dos de muy alto perfil. Lo aterrador es que solo puedo pensar en una API pública que se autodescriba y hay algunas que realmente implementan la restricción hipermedia. Seguro que algunos sitios como StackOverflow y Gowalla admiten enlaces en sus respuestas, pero hay enormes agujeros en sus enlaces. La API StackOverflow no tiene página raíz. ¡Imagínese cuán exitoso hubiera sido el sitio web si no hubiera una página de inicio para el sitio web!
Te engañaste, me temo
Si ha llegado hasta aquí, la respuesta breve a su pregunta es que las API (Netflix y Twitter) no se ajustan a todas las restricciones y, por lo tanto, no obtendrá los beneficios que se supone que deben traer las API REST.
Los clientes REST tardan más en compilarse que los clientes SOAP, pero no están vinculados a un servicio específico, por lo que debería poder reutilizarlos en todos los servicios. Tomemos el ejemplo clásico de un navegador web. ¿A cuántos servicios puede acceder un navegador web? ¿Qué pasa con un lector de feeds? Ahora, ¿a cuántos servicios diferentes puede acceder el cliente promedio de Twitter? Si, solo uno.
Se supone que los clientes REST no están diseñados para interactuar con un solo servicio, sino que están diseñados para manejar tipos de medios específicos que podrían ser servidos por cualquier servicio. La pregunta obvia es: ¿cómo puede construir un cliente REST para un servicio que ofrece application / json o application / xml? Pues no puedes. Eso es porque esos formatos son completamente inútiles para un cliente REST. Tú mismo lo dijiste
tiene que hacer "conjeturas" sobre lo que volverá a aparecer a través de la tubería ya que no hay un esquema real o documento de referencia
Tiene toda la razón en servicios como Twitter. Sin embargo, la restricción autodescriptiva en REST dice que el encabezado del tipo de contenido HTTP debe describir exactamente el contenido que se transmite a través del cable. La entrega de application / json y application / xml no le dice nada sobre el contenido.
Cuando se trata de considerar el rendimiento de los sistemas basados en REST, es necesario observar el panorama general. Hablar sobre bytes de sobre es como hablar sobre el desenrollado de bucles cuando se compara una ordenación rápida con una ordenación de shell. Hay escenarios en los que SOAP puede funcionar mejor y hay escenarios en los que REST puede funcionar mejor. El contexto lo es todo.
REST obtiene gran parte de su ventaja de rendimiento al ser muy flexible sobre los tipos de medios que admite y al tener un soporte sofisticado para el almacenamiento en caché. Para que el almacenamiento en caché funcione bien, se deben cumplir casi todas las restricciones.
Su último punto sobre las URL legibles es, con mucho, el más irónico. Si realmente se compromete con la restricción de hipermedia, entonces cada URL podría ser un GUID y el desarrollador del cliente no perdería nada en la legibilidad.
El hecho de que los URI sean opacos para el cliente es una de las cosas más importantes al desarrollar sistemas REST. Las URL legibles son convenientes para el desarrollador del servidor y las URL bien estructuradas facilitan que el marco del servidor envíe las solicitudes, pero esos son detalles de implementación que no deberían tener ningún impacto en los desarrolladores que consumen la API.
La API de Twitter ni siquiera está cerca de ser RESTful y es por eso que no puede ver ningún beneficio al usarla a través de SOAP. La API de Netflix está mucho más cerca, pero su uso de tipos de medios genéricos demuestra que el incumplimiento de una sola restricción puede tener un profundo impacto en los beneficios derivados del servicio.
Puede que no sea toda su culpa
He dejado mucho de lado a los proveedores de servicios, pero se necesitan dos para bailar RESTAMENTE. Un servicio puede seguir todas las restricciones religiosamente y un cliente aún puede deshacer fácilmente todos los beneficios.
Si un cliente codifica las URL para acceder a ciertos tipos de recursos, entonces está evitando que el servidor cambie esas URL. Cualquier tipo de construcción de URL basada en el conocimiento implícito de cómo el servicio estructura sus URL es una violación.
Hacer suposiciones sobre qué tipo de representación se devolverá de un enlace puede generar problemas. Hacer suposiciones sobre el contenido de la representación basada en el conocimiento que no se menciona explícitamente en los encabezados HTTP definitivamente creará un acoplamiento que causará dolor en el futuro.
¿Deberían haber usado jabón?
Personalmente, no lo creo. REST hecho correctamente permite que un sistema distribuido evolucione a largo plazo. Si está creando sistemas distribuidos que tienen componentes desarrollados por diferentes personas y necesitan durar muchos años, entonces REST es una muy buena opción.