rest - json rpc client
REST vs JSON-RPC? (16)
Pregunta errónea: impone un maniquí que no existe!
Puede usar JSON-RPC con "menos verbo" (sin método ) y conservar la estandarización mínima necesaria para la identificación de Sendo, los parámetros, los códigos de error y los mensajes de advertencia . El estándar JSON-RPC no dice "no se puede DESCONECTAR", solo dice cómo empaquetar información básica.
"REST JSON-RPC" existe ! es RESTO con "mejores prácticas", para un mínimo de información, con contratos simples y sólidos.
Ejemplo
(De esta respuesta y contexto didáctico).
Cuando se trata de REST, generalmente ayuda comenzar pensando en términos de recursos. En este caso, el recurso no es solo "cuenta bancaria" sino que es una transacción de esa cuenta bancaria ... Pero JSON-RPC no obliga el parámetro "método", todos están codificados por "ruta" del punto final.
Depósito REST con
POST /Bank/Account/John/Transaction
con solicitud JSON{"jsonrpc": "2.0", "id": 12, "params": {"currency":"USD","amount":10}}
.
La respuesta JSON puede ser algo como{"jsonrpc": "2.0", "result": "sucess", "id": 12}
REST Retirar con
POST /Bank/Account/John/Transaction
... similar....
GET /Bank/Account/John/Transaction/12345@13
... Esto podría devolver un registro JSON de esa transacción exacta (por ejemplo, sus usuarios generalmente desean un registro de débitos y créditos en su cuenta). Algo como{"jsonrpc": "2.0", "result": {"debits":[...],"credits":[...]}, "id": 13}
. La convención sobre la solicitud GET (REST) puede incluir la codificación de la identificación por "@id", por lo que no es necesario enviar ningún JSON, pero sigue usando JSON-RPC en el paquete de respuesta.
Estoy tratando de elegir entre REST y JSON-RPC para desarrollar una API para una aplicación web. ¿Cuál es más fácil de usar para los clientes API?
Actualización 2018: GraphQL ofrece varias ventajas sobre las opciones tradicionales, específicamente elimina la necesidad de normalizar, desnormalizar y almacenar en caché los datos entre el servidor y el cliente, además agrega las llamadas API de los componentes de la interfaz de usuario sin crear un estado de cliente único que permita a los desarrolladores crear componentes de la interfaz de usuario Independientemente y en paralelo.
Actualización 2015: he encontrado que REST es más fácil de desarrollar y utilizar para una API que se sirve en Web / HTTP, porque la API puede aprovechar el protocolo HTTP existente y maduro que tanto el cliente como el servidor entienden. Por ejemplo, la API puede utilizar códigos de respuesta, encabezados, consultas, cuerpos de publicaciones, almacenamiento en caché y muchas otras características sin ningún esfuerzo o configuración adicional.
Creo que hay un punto que la gente olvidó mencionar. Si ya tiene una aplicación web, entonces es deseable REST, ya que de todos modos necesitará el servidor de la aplicación y puede proteger ambos usando https ... pero si no tiene una aplicación web (solo tiene una aplicación), entonces RPC es deseable ya que ya no es necesario configurar un servidor de aplicaciones y configurarlo, lo cual es muy sencillo. Aparte de eso, no veo ninguna ventaja fundamental real en ninguno de los dos.
Creo que, como siempre, depende ...
REST tiene la gran ventaja de contar con un amplio apoyo público y esto significa muchas herramientas y libros. Si necesita crear una API que sea utilizada por un gran número de consumidores de diferentes organizaciones, entonces es la manera de hacerlo por una sola razón: es popular. Como protocolo, por supuesto, es un fracaso total, ya que hay muchas formas completamente diferentes de asignar un comando a una URL / verbo / respuesta.
Por lo tanto, cuando escribe una aplicación web de una sola página que necesita hablar con un servidor, creo que REST es demasiado complejo. En esta situación, no tiene que preocuparse por la compatibilidad a largo plazo, ya que la aplicación y la API pueden evolucionar juntas.
Una vez comencé con REST para una aplicación web de una sola página, pero los comandos detallados entre la aplicación web y el servidor rápidamente me volvieron loco. ¿Debo codificarlo como un parámetro de ruta? ¿En el cuerpo? ¿Un parámetro de consulta? Un encabezado? Después del diseño de URL / Verbo / Respuesta, tuve que codificar este lío en Javascript, el decodificador en Java y luego llamar al método real. Aunque hay muchas herramientas para ello, es realmente difícil no obtener ninguna semántica HTTP en su código de dominio, lo que es una práctica realmente mala. (Cohesión)
Intente crear un archivo Swagger / OpenAPI para un sitio de medio complejo y compárelo con una única interfaz Java que describe los procedimientos remotos en ese archivo. El aumento de la complejidad es asombroso.
Por lo tanto, cambié de REST a JSON-RPC para la aplicación web de una sola página. aDesarrollé una pequeña biblioteca que codificaba una interfaz Java en el servidor y la enviaba al navegador. En el navegador, esto creó un proxy para el código de la aplicación que devolvió una promesa para cada función.
Nuevamente, REST tiene su lugar solo porque es famoso y, por lo tanto, bien apoyado. También es importante reconocer la filosofía subyacente de los recursos sin estado y el modelo jerárquico. Sin embargo, estos principios pueden ser fácilmente utilizados en un modelo RPC. JSON RPC funciona sobre HTTP, por lo que tiene las mismas ventajas de REST en esta área. La diferencia es que cuando, inevitablemente, te encuentras con estas funciones que no se corresponden con estos principios, no estás obligado a hacer mucho trabajo innecesario.
De acuerdo con el modelo de madurez de Richardson , la pregunta no es REST vs. RPC , sino cuánto REST .
En esta vista, el cumplimiento con el estándar REST se puede clasificar en 4 niveles.
- Nivel 0: pensar en términos de acciones y parámetros. Como lo explica el artículo, esto es esencialmente equivalente a JSON-RPC (el artículo lo explica para XML-RPC, pero los mismos argumentos se mantienen para ambos).
- Nivel 1: pensar en términos de recursos. Todo lo relevante para un recurso pertenece a la misma URL.
- nivel 2: usar verbos HTTP
- Nivel 3: HATEOAS
De acuerdo con el creador del estándar REST, solo los servicios de nivel 3 pueden llamarse RESTful. Sin embargo, esta es una métrica de cumplimiento , no de calidad. Si solo desea llamar a una función remota que realiza un cálculo, probablemente no tenga sentido tener enlaces hipermedia relevantes en la respuesta, ni diferencia de comportamiento en función del verbo HTTP utilizado. Por lo tanto, una llamada de este tipo tiende a ser más parecida a RPC. Sin embargo, un nivel de cumplimiento más bajo no significa necesariamente estado de estado, o un acoplamiento más alto. Probablemente, en lugar de pensar en REST vs. RPC , deberías usar tanto REST como sea posible, pero no más. No retuerza su aplicación solo para que se ajuste a los estándares de cumplimiento RESTful.
El problema fundamental con RPC es el acoplamiento. Los clientes RPC se unen estrechamente a la implementación del servicio de varias maneras y resulta muy difícil cambiar la implementación del servicio sin romper los clientes:
- Los clientes deben saber los nombres de los procedimientos;
- Parámetros de procedimiento orden, tipos y conteos importantes. No es tan fácil cambiar las firmas de procedimientos (número de argumentos, orden de argumentos, tipos de argumentos, etc.) en el lado del servidor sin romper las implementaciones del cliente;
- El estilo RPC no expone nada más que puntos finales de procedimiento + argumentos de procedimiento. Es imposible que el cliente determine qué se puede hacer a continuación.
Por otro lado, en el estilo REST es muy fácil guiar a los clientes al incluir información de control en las representaciones (encabezados HTTP + representación). Por ejemplo:
- Es posible (y en realidad obligatorio) incrustar enlaces anotados con tipos de relaciones de enlace que transmiten significados de estos URI;
- Las implementaciones de los clientes no necesitan depender de nombres y argumentos de procedimientos particulares. En cambio, los clientes dependen de los formatos de mensaje. Esto crea la posibilidad de usar bibliotecas ya implementadas para formatos de medios particulares (por ejemplo, Atom, HTML, Collection + JSON, HAL, etc.)
- Es posible cambiar fácilmente los URI sin interrumpir a los clientes en la medida en que solo dependen de las relaciones de enlace registradas (o específicas del dominio);
- Es posible incrustar estructuras similares a formas en representaciones, dando a los clientes la posibilidad de exponer estas descripciones como capacidades de UI si el usuario final es humano;
- El soporte para el almacenamiento en caché es una ventaja adicional;
- Códigos de estado estandarizados;
Hay muchas más diferencias y ventajas en el lado de REST.
En mi opinión, el punto clave es la acción frente a la orientación de recursos. REST está orientado a los recursos y se adapta bien a las operaciones de CRUD y, dada su semántica conocida, proporciona cierta previsibilidad a un primer usuario, pero cuando se implementa desde métodos o procedimientos lo obliga a proporcionar una traducción artificial al mundo centrado en los recursos. Por otro lado, RPC se adapta perfectamente a las API orientadas a la acción, donde expone servicios, no conjuntos de recursos capaces de CRUD.
Sin duda, REST es más popular, esto definitivamente agrega algunos puntos si desea exponer la API a un tercero.
Si no es así (por ejemplo, en el caso de crear un front-end AJAX en un SPA), mi elección es RPC. En particular, JSON-RPC, combinado con el esquema JSON como lenguaje de descripción, y se transporta a través de HTTP o Websockets según el caso de uso.
JSON-RPC es una especificación simple y elegante que define las cargas útiles JSON de solicitud y respuesta que se utilizarán en RPC síncrono o asíncrono.
El esquema JSON es un borrador de especificación que define un formato basado en JSON destinado a describir datos JSON. Al describir los mensajes de entrada y salida del servicio utilizando el esquema JSON, puede tener una complejidad arbitraria en la estructura del mensaje sin comprometer la facilidad de uso, y la integración del servicio se puede automatizar.
La elección del protocolo de transporte (HTTP vs websockets) depende de diferentes factores, siendo el más importante si necesita funciones HTTP (almacenamiento en caché, revalidación, seguridad, idempotencia, tipo de contenido, varias partes, ...) o si su aplicación necesita intercambiar Mensajes a altas frecuencias.
Hasta ahora mi opinión personal sobre este tema es muy importante, pero ahora hay algo que puede ser realmente útil para aquellos desarrolladores de Java que leen estas líneas, el marco en el que he estado trabajando durante el último año, que nace de la misma pregunta que ahora se pregunta. :
Puede ver una demostración en vivo aquí, mostrando el navegador de repositorio incorporado para las pruebas funcionales (gracias al esquema JSON) y una serie de servicios de ejemplo:
Espero que ayude a mate!
Nacho
Grandes respuestas - solo quería aclarar algunos de los comentarios. JSON-RPC es rápido y fácil de consumir, pero como los recursos y parámetros mencionados están estrechamente acoplados y tiende a depender de verbos (api / deleteUser, api / addUser) usando GET / POST donde-como REST proporciona recursos débilmente acoplados (api / usuarios) que en una API REST HTTP se basa en varios métodos HTTP (GET, POST, PUT, PATCH, DELETE). REST es un poco más difícil de implementar para los desarrolladores sin experiencia, pero el estilo se ha convertido en un lugar bastante común ahora y ofrece mucha más flexibilidad a largo plazo (lo que le da a su API una vida más larga).
Además de no tener recursos estrechamente acoplados, REST también le permite evitar comprometerse con un solo tipo de contenido, esto significa que si su cliente necesita recibir los datos en XML, JSON o incluso YAML, si estuviera integrado en su sistema, podría devuelva cualquiera de los que usen los encabezados de contenido / aceptar.
Esto le permite mantener su API lo suficientemente flexible como para admitir nuevos tipos de contenido O los requisitos del cliente.
Pero lo que realmente separa a REST de JSON-RPC es que sigue una serie de restricciones cuidadosamente pensadas, lo que garantiza la flexibilidad arquitectónica. Estas restricciones incluyen garantizar que el cliente y el servidor puedan evolucionar independientemente entre sí (puede hacer cambios sin alterar la aplicación de su cliente), las llamadas son sin estado (el estado se representa a través de hipermedia), se proporciona una interfaz uniforme para las interacciones, la API se desarrolla en un sistema de capas y la respuesta es almacenable por el cliente. También hay una restricción opcional para proporcionar código a pedido.
Sin embargo, con todo esto dicho, la mayoría de las API no son REST (según Fielding) ya que no incorporan hipermedia (enlaces de hipertexto incrustados en la respuesta que ayudan a navegar la API). La mayoría de las API que encontrará allí son como REST, ya que siguen la mayoría de los conceptos de REST, pero ignoran esta restricción. Sin embargo, cada vez más API están implementando esto y se está convirtiendo en una práctica de corriente principal.
Esto también le brinda cierta flexibilidad, ya que las API controladas por hipermedia (como Stormpath) dirigen al cliente a los URI (lo que significa que si algo cambia, en ciertos casos puede modificar el URI sin impacto negativo), donde se requiere que, como con los RPC, los URI sean estático. Con RPC, también necesitará documentar ampliamente estos diferentes URI y explicar cómo funcionan en relación con los demás.
En general, diría que REST es el camino a seguir si desea crear una API extensible y flexible que sea de larga duración. Por esa razón, diría que es la ruta a recorrer el 99% del tiempo.
Buena suerte Mike
He explorado el tema con cierto detalle y decidí que la REST pura es demasiado limitante, y RPC es la mejor, aunque la mayoría de mis aplicaciones son aplicaciones CRUD. Si se apega a REST, finalmente se va a rascar la cabeza preguntándose cómo puede agregar fácilmente otro método necesario a su API para algún propósito especial. En muchos casos, la única forma de hacerlo con REST es crear otro controlador para él, lo que puede complicar indebidamente su programa.
Si decide utilizar RPC, la única diferencia es que está especificando explícitamente el verbo como parte de la URI, que es claro, coherente, con menos errores y, en realidad, no presenta problemas. Especialmente si creas una aplicación que va más allá de CRUD simple, RPC es la única manera de hacerlo. Tengo otro problema con los puristas REST: HTTP POST, GET, PUT, DELETE tienen significados definidos en HTTP que han sido subvertidos por REST para significar otras cosas, simplemente porque encajan la mayor parte del tiempo, pero no todo el tiempo.
En programación, hace mucho tiempo descubrí que intentar usar una cosa para significar dos cosas vendrá en algún momento y te morderá. Me gusta tener la capacidad de usar POST para casi todas las acciones, ya que brinda la libertad de enviar y recibir datos como su método necesita. No puedes encajar todo el mundo en CRUD.
He sido un gran fan de REST en el pasado y tiene muchas ventajas sobre RPC en papel. Puede presentar al cliente diferentes tipos de contenido, almacenamiento en caché, reutilización de los códigos de estado HTTP, puede guiar al cliente a través de la API y puede incrustar documentación en la API si no es en su mayor parte autoexplicativo.
Pero mi experiencia ha sido que, en la práctica, esto no se sostiene y, en cambio, haces mucho trabajo innecesario para que todo salga bien. Además, los códigos de estado HTTP a menudo no se asignan exactamente a la lógica de su dominio y usarlos en su contexto a menudo resulta un poco forzado. Pero lo peor de REST en mi opinión es que dedicas mucho tiempo a diseñar tus recursos y las interacciones que permiten. Y siempre que haga algunas adiciones importantes a su API, espera encontrar una buena solución para agregar la nueva funcionalidad y ya no se diseñó en un rincón.
A menudo esto me parece una pérdida de tiempo porque la mayoría de las veces ya tengo una idea perfectamente clara y obvia sobre cómo modelar una API como un conjunto de llamadas a procedimientos remotos. ¿Y si he pasado por todo este esfuerzo para modelar mi problema dentro de las restricciones de REST, el siguiente problema es cómo llamarlo desde el cliente? Nuestros programas se basan en los procedimientos de llamada, por lo que crear una buena biblioteca de cliente RPC es fácil, no tanto crear una buena biblioteca de cliente REST y en la mayoría de los casos simplemente mapeará desde su API REST en el servidor a un conjunto de procedimientos en su cliente biblioteca.
Debido a esto, RPC se siente mucho más simple y más natural para mí hoy. Sin embargo, lo que realmente extraño es un marco coherente que facilita la escritura de servicios RPC que son autodescriptivos e interoperables. Por lo tanto, creé mi propio proyecto para experimentar nuevas formas de hacer que RPC sea más fácil para mí y tal vez alguien más lo encuentre útil también: https://github.com/aheck/reflectrpc
Primero, HTTP-REST es una arquitectura de "transferencia de estado representacional". Esto implica muchas cosas interesantes:
- Su API no tendrá estado y, por lo tanto, será mucho más fácil de diseñar (es realmente fácil olvidar una transición en un autómata complejo) e integrarse con partes de software independientes.
- Serás conducido a diseñar métodos de lectura como métodos seguros , que serán fáciles de almacenar en caché e integrar.
- Serás conducido a diseñar métodos de escritura como idempotentes , que se ocuparán mucho mejor de los tiempos de espera.
En segundo lugar, HTTP-REST es totalmente compatible con HTTP (consulte "seguro" e "idempotente" en la parte anterior), por lo tanto, podrá reutilizar las bibliotecas HTTP (existentes para cada idioma existente) y los proxies inversos HTTP, que le darán la capacidad de implementar características avanzadas (caché, autenticación, compresión, redirección, reescritura, registro, etc.) con una línea de código cero.
Por último, pero no menos importante, el uso de HTTP como protocolo RPC es un gran error según el diseñador de HTTP 1.1 (y el inventor de REST): http://www.ics.uci.edu/~fielding/pubs/dissertation/evaluation.htm#sec_6_5_2
REST está acoplado estrechamente con HTTP, por lo que si solo expone su API a través de HTTP, REST es más apropiado para la mayoría de las situaciones (pero no todas). Sin embargo, si necesita exponer su API en otros transportes como mensajería o sockets web, REST simplemente no es aplicable.
Sería mejor elegir JSON-RPC entre REST y JSON-RPC para desarrollar una API para una aplicación web que sea más fácil de entender. Se prefiere JSON-RPC porque su correspondencia con las llamadas de método y las comunicaciones se puede entender fácilmente.
La elección del enfoque más adecuado depende de las restricciones o del objetivo principal. Por ejemplo, en la medida en que el rendimiento es un rasgo importante, es recomendable optar por JSON-RPC (por ejemplo, High Performance Computing). Sin embargo, si el objetivo principal es ser agnóstico para ofrecer una interfaz genérica para ser inferida por otros, es recomendable optar por REST. Si se necesitan ambos objetivos para lograrlos, es recomendable incluir ambos protocolos.
El hecho que realmente divide a REST de JSON-RPC es que sigue una serie de restricciones cuidadosamente pensadas, lo que confirma la flexibilidad arquitectónica. Las restricciones se toman para garantizar que tanto el cliente como el servidor puedan crecer independientemente unos de otros (los cambios se pueden hacer sin alterar la aplicación del cliente), las llamadas son apátridas (el estado se considera hipermedia), un uniforme La interfaz se ofrece para las interacciones, la API es avanzada en un sistema de capas (Hall, 2010). JSON-RPC es rápido y fácil de consumir, sin embargo, como los recursos mencionados, así como los parámetros están estrechamente relacionados y es probable que dependa de los verbos (api / addUser, api / deleteUser) que utilizan GET / POST, mientras que REST ofrece recursos de acoplamiento débil (api / usuarios) en un HTTP. La API REST depende de varios métodos HTTP como GET, PUT, POST, DELETE, PATCH. REST es un poco más difícil de implementar para desarrolladores inexpertos.
JSON (indicado como Notación de Objeto de JavaScript) es un formato ligero de intercambio de datos, es fácil de leer y escribir para los humanos. Es sin complicaciones para las máquinas analizar y generar. JSON es un formato de texto que es totalmente independiente del lenguaje pero que practica convenciones que son conocidas por los programadores de la familia de lenguajes, que incluyen C #, C, C ++, Java, Perl, JavaScript, Python y muchos otros. Tales propiedades hacen de JSON un perfecto lenguaje de intercambio de datos y una mejor opción para optar.
Si solicita recursos, entonces la API RESTful es mejor por diseño. Si solicita algunos datos complicados con muchos parámetros y métodos complicados que no sean CRUD simple, entonces RPC es el camino correcto.
Si su servicio funciona bien solo con modelos y el patrón GET / POST / PUT / DELETE, use REST puro.
Estoy de acuerdo en que HTTP está diseñado originalmente para aplicaciones sin estado.
Pero para las aplicaciones modernas, más complejas (!) En tiempo real (web) en las que querrá usar Websockets (que a menudo implican estado de estado), ¿por qué no usar ambos? JSON-RPC sobre Websockets es muy ligero, por lo que tiene los siguientes beneficios:
- Actualizaciones instantáneas en cada cliente (defina su propia llamada RPC de servidor a cliente para actualizar los modelos)
- Fácil de agregar complejidad (intente hacer un clon de Etherpad con solo REST)
- Si lo haces bien (agrega RPC solo como extra por tiempo real), la mayoría se puede usar solo con REST (excepto si la característica principal es un chat o algo así)
Como solo está diseñando la API del lado del servidor, comience con la definición de los modelos REST y luego agregue el soporte JSON-RPC según sea necesario, manteniendo el número de llamadas RPC al mínimo.
(y perdón por el uso excesivo de paréntesis)
Uso vdata para el protocolo RPC: http://vdata.dekuan.org/
1, PHP y JavaScript están bien. 2, la llamada CORS (Intercambio de recursos de origen cruzado) aún está bien.
Por qué JSON RPC:
En el caso de las aplicaciones REST, debemos definir un controlador para cada funcionalidad / método que podamos necesitar. Como resultado, si tenemos 10 métodos que queremos que sean accesibles para un cliente, tenemos que escribir 10 controladores para interconectar la solicitud del cliente con un método en particular.
Otro factor es que, aunque tenemos diferentes controladores para cada método / funcionalidad, el cliente debe recordar si debe usar POST o GET. Esto complica aún más las cosas. Además de eso para enviar datos, uno tiene que establecer el tipo de contenido de la solicitud si se usa POST.
En el caso de JSON RPC, las cosas se simplifican enormemente porque la mayoría de los servidores JSONRPC funcionan con métodos POST HTTP y el tipo de contenido es siempre application / json. Esto elimina la carga de recordar el uso del método HTTP adecuado y la configuración de contenido en el lado del cliente.
Uno no tiene que crear controladores separados para los diferentes métodos / funcionalidades que el servidor quiere exponer a un cliente.
Por qué REST:
Tiene direcciones URL separadas para las diferentes funciones que el servidor desea exponer al lado del cliente. Como resultado, puede incrustar estas direcciones URL.
La mayoría de estos puntos son discutibles y dependen completamente de la necesidad de una persona.