JSON-RPC (JavaScript Object Notation-Remote Procedure Call) es un protocolo de comunicaciones basado en JSON para llamadas a procedimientos remotos (RPC). Es similar al protocolo XML-RPC y define solo unos pocos tipos de datos y comandos. JSON-RPC admite notificaciones (datos enviados al servidor que no requieren respuesta) y el envío de varias llamadas al servidor, que pueden responderse de forma asíncrona.
El protocolo JSON-RPC es independiente del transporte y puede transmitirse mediante muchos protocolos de transporte de datos distintos, entre ellos la E/S mediante descriptores de archivo, HTTP y TCP. No ofrece directamente ningún soporte para autenticación ni autorización.
| Versión | Descripción | Fecha |
|---|---|---|
| 1.0 | Versión original | 2005 |
| 1.1 WD | Borrador de trabajo. Añade parámetros con nombre, códigos de error específicos y funciones de introspección. | 7 de agosto de 2006 |
| 1.1 Alt | Sugerencia para un JSON-RPC 1.1 simple. Propuesta alternativa a 1.1 WD. | 6 de mayo de 2007 |
| 1.1 Object Specification | Especificación de objetos. Propuesta alternativa a 1.1 WD y 1.1 Alt. | 30 de julio de 2007 |
| 1.2 | Propuesta. Una revisión posterior de este documento pasó a llamarse 2.0. | 27 de diciembre de 2007 |
| 2.0 | Propuesta de especificación | 24 de mayo de 2009 |
| 2.0 (revisada) | Especificación | 26 de marzo de 2010 |
JSON-RPC funciona enviando una solicitud a un servidor que implementa este protocolo. En ese caso, el cliente suele ser un programa que pretende llamar a un único método de un sistema remoto. Se pueden pasar varios parámetros de entrada al método remoto como una matriz o un objeto, y el propio método también puede devolver varios datos de salida (esto depende de la versión implementada).
Todos los tipos de transferencia son objetos únicos, serializados mediante JSON.
Una solicitud es una llamada a un método concreto proporcionado por un sistema remoto. Puede contener tres miembros:
method: una cadena con el nombre del método que se va a invocar. Los nombres de método que comienzan por «rpc.» están reservados para métodos internos de RPC.params: un objeto o una matriz de valores que se pasarán como parámetros al método indicado. Este miembro puede omitirse.id: una cadena o un número no fraccionario que sirve para relacionar la respuesta con la solicitud a la que responde. Este miembro puede omitirse si no debe devolverse ninguna respuesta.El receptor de la solicitud debe responder con una respuesta válida a todas las solicitudes recibidas. Una respuesta puede contener los miembros que se indican a continuación:
result: los datos devueltos por el método invocado. Si se produjo un error al invocar el método, este miembro no debe existir.error: un objeto de error si se produjo un error al invocar el método; en caso contrario, este miembro no debe existir. El objeto debe contener los miembros code (entero) y message (cadena). Un miembro opcional data puede contener datos adicionales específicos del servidor. Existen códigos de error predefinidos que siguen los definidos para XML-RPC.id: el identificador de la solicitud a la que se responde.| Código de error | Mensaje | Descripción |
|---|---|---|
| −32700 | Parse error | Se recibió un JSON no válido |
| −32600 | Invalid Request | El JSON enviado no es un objeto de solicitud válido |
| −32601 | Method not found | El método no existe o no está disponible |
| −32602 | Invalid params | Parámetros del método no válidos |
| −32603 | Internal error | Error interno de JSON-RPC |
| −32000 a −32099 | Server error | Reservado para errores del servidor definidos por la implementación |
Como hay situaciones en las que no se necesita ni se desea una respuesta, se introdujeron las notificaciones. Una notificación es similar a una solicitud, salvo por el id, que no es necesario porque no se devolverá ninguna respuesta. En ese caso, la propiedad id debe omitirse (versión 2.0) o ser null (versión 1.0).
En estos ejemplos, --> indica los datos enviados a un servicio (solicitud), mientras que <-- indica los datos que llegan desde un servicio. Aunque <-- suele llamarse respuesta en la computación cliente-servidor, según la versión de JSON-RPC no implica necesariamente una contestación a una solicitud.
Solicitud y respuesta:
--> {"jsonrpc": "2.0", "method": "subtract", "params": {"minuend": 42, "subtrahend": 23}, "id": 3}
<-- {"jsonrpc": "2.0", "result": 19, "id": 3}
Notificación (sin respuesta y sin id):
--> {"jsonrpc": "2.0", "method": "update", "params": [1,2,3,4,5]}
Error de análisis:
--> {"jsonrpc": "2.0", "method": "subtract", "params":
<-- {"jsonrpc": "2.0", "error": {"code": -32700, "message": "Parse error"}, "id": null}
Solicitud no válida:
--> {"jsonrpc": "2.0", "method": 1, "params": "bar"}
<-- {"jsonrpc": "2.0", "error": {"code": -32600, "message": "Invalid Request"}, "id": null}
Método no encontrado:
--> {"jsonrpc": "2.0", "method": "foobar", "id": 1}
<-- {"jsonrpc": "2.0", "error": {"code": -32601, "message": "Method not found"}, "id": 1}
Parámetros no válidos:
--> {"jsonrpc": "2.0", "method": "subtract", "params": {"minuend": 42}, "id": 2}
<-- {"jsonrpc": "2.0", "error": {"code": -32602, "message": "Invalid params", "data": "Missing required parameter: subtrahend"}, "id": 2}
Error interno:
--> {"jsonrpc": "2.0", "method": "getData", "params": [], "id": 4}
<-- {"jsonrpc": "2.0", "error": {"code": -32603, "message": "Internal error"}, "id": 4}
Solicitud por lotes con errores:
--> [
{"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": 1},
{"jsonrpc": "2.0", "method": "foobar", "id": 2},
{"foo": "bar"}
]
<-- [
{"jsonrpc": "2.0", "result": 19, "id": 1},
{"jsonrpc": "2.0", "error": {"code": -32601, "message": "Method not found"}, "id": 2},
{"jsonrpc": "2.0", "error": {"code": -32600, "message": "Invalid Request"}, "id": null}
]
Solicitud y respuesta:
--> {"version": "1.1", "method": "confirmFruitPurchase", "params": [["apple", "orange", "mangoes"], 1.123], "id": "194521489"}
<-- {"version": "1.1", "result": "done", "error": null, "id": "194521489"}
Solicitud y respuesta:
--> {"method": "echo", "params": ["Hello JSON-RPC"], "id": 1}
<-- {"result": "Hello JSON-RPC", "error": null, "id": 1}