JSON-RPC ( JavaScript Object Notation – Remote Procedure Call ) ist ein JSON -basiertes Protokoll für Remote Procedure Calls (RPC). Es ähnelt dem XML-RPC- Protokoll und definiert nur wenige Datentypen und Befehle. JSON-RPC ermöglicht Benachrichtigungen (Daten, die an den Server gesendet werden und keine Antwort erfordern) sowie das Senden mehrerer Anfragen an den Server, die asynchron beantwortet werden können.

Das JSON-RPC-Protokoll ist transportunabhängig und kann über viele verschiedene Datentransportprotokolle übertragen werden, darunter Dateideskriptor- I/O, HTTP und TCP . Es bietet keine direkte Unterstützung für Authentifizierung oder Autorisierung.

Geschichte

Version Beschreibung Datiert
1.0 Originalfassung2005
1.1 WD Arbeitsentwurf . Fügt benannte Parameter, spezifische Fehlercodes und Introspektionsfunktionen hinzu. 07.08.2006
1.1 Alt Vorschlag für ein einfaches JSON-RPC 1.1 . Alternativer Vorschlag zu 1.1 WD. 06.05.2007
1.1 Objektspezifikation Objektspezifikation . Alternativer Vorschlag zu 1.1 WD/1.1ALT. 30.07.2007
1.2 Vorschlag . Eine spätere Überarbeitung dieses Dokuments wurde in Version 2.0 umbenannt. 27.12.2007
2.0 Spezifikationsvorschlag24.05.2009
2.0 (Überarbeitet-) Spezifikation26.03.2010

Verwendung

JSON-RPC funktioniert, indem eine Anfrage an einen Server gesendet wird, der dieses Protokoll implementiert. Der Client ist in diesem Fall typischerweise eine Software, die eine einzelne Methode eines entfernten Systems aufrufen möchte. Mehrere Eingabeparameter können als Array oder Objekt an die entfernte Methode übergeben werden, während die Methode selbst auch mehrere Ausgabedaten zurückgeben kann. (Dies hängt von der implementierten Version ab.)

Alle Übertragungstypen sind einzelne Objekte, die mit JSON serialisiert werden. [ 1 ]

Anfrage

Eine Anfrage ist ein Aufruf einer bestimmten Methode eines entfernten Systems. Sie kann drei Elemente enthalten:

  • method- Eine Zeichenkette mit dem Namen der aufzurufenden Methode. Methodennamen, die mit "rpc." beginnen, sind für rpc-interne Methoden reserviert.
  • params- Ein Objekt oder ein Array von Werten, die als Parameter an die definierte Methode übergeben werden sollen. Dieses Element kann weggelassen werden.
  • id- Eine Zeichenkette oder eine Zahl ohne Bruchteil, die verwendet wird, um die Antwort der zugehörigen Anfrage zuzuordnen. [ 2 ] Dieses Element kann weggelassen werden, wenn keine Antwort zurückgegeben werden soll. [ 3 ]

Antwort

Der Empfänger der Anfrage muss auf alle eingehenden Anfragen mit einer gültigen Antwort antworten. Eine Antwort kann die unten genannten Elemente enthalten.

  • result- Die von der aufgerufenen Methode zurückgegebenen Daten. Wenn beim Aufruf der Methode ein Fehler aufgetreten ist, darf dieses Element nicht existieren. [ 4 ]
  • error- Ein Fehlerobjekt, falls beim Aufruf der Methode ein Fehler aufgetreten ist; andernfalls darf dieses Element nicht existieren. [ 5 ] Das Objekt muss die Elemente „Code“ ( Ganzzahl ) und „Nachricht“ (Zeichenkette) enthalten. [ 6 ] Ein optionales Datenelement kann weitere serverspezifische Daten enthalten. Es gibt vordefinierte Fehlercodes, die den für XML-RPC definierten Codes entsprechen.
  • id- Die ID der Anfrage, auf die es antwortet.
FehlercodeNachrichtBeschreibung
-32700ParsefehlerUngültiges JSON wurde empfangen
-32600Ungültige AnfrageDas gesendete JSON ist kein gültiges Request-Objekt.
-32601Methode nicht gefundenDie Methode existiert nicht / ist nicht verfügbar
-32602Ungültige ParameterUngültige Methodenparameter
-32603Interner FehlerInterner JSON-RPC-Fehler
−32000 bis −32099ServerfehlerReserviert für implementierungsdefinierte Serverfehler

Da es Situationen gibt, in denen keine Antwort erforderlich oder erwünscht ist, wurden Benachrichtigungen eingeführt. Eine Benachrichtigung ähnelt einer Anfrage, mit Ausnahme der ID, die nicht benötigt wird, da keine Antwort zurückgegeben wird. In diesem Fall idsollte die Eigenschaft weggelassen (Version 2.0) oder auf „false“ gesetzt werden null(Version 1.0).

Beispiele

In diesen Beispielen -->bezeichnet Daten, die an einen Dienst gesendet werden ( Anfrage ), während <--Daten bezeichnet, die von einem Dienst stammen. Obwohl in der Client-Server-<-- Architektur oft als Antwort bezeichnet wird , bedeutet dies – abhängig von der JSON-RPC-Version – nicht zwangsläufig eine Antwort auf eine Anfrage .

Version 2.0

Anfrage und Antwort:

-- > { "jsonrpc" : "2.0" , "method" : "subtract" , "params" : { "minuend" : 42 , "subtrahend" : 23 }, "id" : 3 } < -- { "jsonrpc" : "2.0" , "result" : 19 , "id" : 3 }

Benachrichtigung (keine Antwort, keine ID):

-- > { "jsonrpc" : "2.0" , "method" : "update" , "params" : [ 1 , 2 , 3 , 4 , 5 ]}

Analysefehler:

-- > { "jsonrpc" : "2.0" , "method" : "subtract" , "params" : < -- { "jsonrpc" : "2.0" , "error" : { "code" : -32700 , "message" : "Parse error" }, "id" : null }

Ungültige Anfrage:

-- > { "jsonrpc" : "2.0" , "method" : 1 , "params" : "bar" } < -- { "jsonrpc" : "2.0" , "error" : { "code" : -32600 , "message" : "Ungültige Anfrage" }, "id" : null }

Methode nicht gefunden:

-- > { "jsonrpc" : "2.0" , "method" : "foobar" , "id" : 1 } < -- { "jsonrpc" : "2.0" , "error" : { "code" : -32601 , "message" : "Methode nicht gefunden" }, "id" : 1 }

Ungültige Parameter:

-- > { "jsonrpc" : "2.0" , "method" : "subtract" , "params" : { "minuend" : 42 }, "id" : 2 } < -- { "jsonrpc" : "2.0" , "error" : { "code" : -32602 , "message" : "Ungültige Parameter" , "data" : "Fehlender erforderlicher Parameter: Subtrahend" }, "id" : 2 }

Interner Fehler:

-- > { "jsonrpc" : "2.0" , "method" : "getData" , "params" : [], "id" : 4 } < -- { "jsonrpc" : "2.0" , "error" : { "code" : -32603 , "message" : "Interner Fehler" }, "id" : 4 }

Batch-Anfrage mit Fehlern:

-- > [ { "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" : "Methode nicht gefunden" }, "id" : 2 }, { "jsonrpc" : "2.0" , "error" : { "code" : -32600 , "message" : "Ungültige Anfrage" }, "id" : null } ]

Version 1.1 (Arbeitsentwurf)

Anfrage und Antwort:

-- > { "version" : "1.1" , "method" : "confirmFruitPurchase" , "params" : [[ "apple" , "orange" , "mangoes" ], 1.123 ], "id" : "194521489" } < -- { "version" : "1.1" , "result" : "done" , "error" : null , "id" : "194521489" }

[ 2 ] Version 1.0

Anfrage und Antwort:

-- > { "method" : "echo" , "params" : [ "Hello JSON-RPC" ], "id" : 1 } < -- { "result" : "Hello JSON-RPC" , "error" : null , "id" : 1 }

Siehe auch

  • gRPC – plattformübergreifendes binäres RPC-Protokoll
  • SOAP – ein Messaging-Protokoll
  • JSON-WSP – ein von JSON-RPC inspiriertes Protokoll mit einer Dienstbeschreibungsspezifikation
  • Model Context Protocol - verwendet JSON-RPC zur Integration von KI-Agenten mit externen Tools [ 7 ].

Referenzen

  1. ^ "Spezifikation - JSON-RPC - Trac" . Archiviert vom Original am 17.05.2008 . Abgerufen am 14.05.2008 .
  2. ^ a b "JSON-RPC 2.0 Spezifikation" . id: Eine vom Client festgelegte Kennung, die, falls angegeben, einen String, eine Zahl oder NULL enthalten MUSS. Ist sie nicht angegeben, wird sie als Benachrichtigung interpretiert. Der Wert SOLLTE normalerweise nicht NULL sein und Zahlen SOLLTEN KEINE Nachkommastellen enthalten.
  3. ^ „JSON-RPC 2.0-Spezifikation“ . Eine Benachrichtigung ist ein Anfrageobjekt ohne „id“-Element. Ein Anfrageobjekt, das eine Benachrichtigung ist, signalisiert dem Client, dass er kein Interesse am zugehörigen Antwortobjekt hat und daher kein Antwortobjekt an den Client zurückgesendet werden muss. Der Server darf nicht auf eine Benachrichtigung antworten, auch nicht auf solche innerhalb einer Batch-Anfrage. Benachrichtigungen sind definitionsgemäß nicht bestätigbar, da sie kein Antwortobjekt zurückgeben. Daher würde der Client keine Fehler (z. B. „Ungültige Parameter“, „Interner Fehler“) bemerken.
  4. ^ "JSON-RPC 2.0-Spezifikation" . Ergebnis: Dieses Element ist bei Erfolg erforderlich. Es darf nicht vorhanden sein, wenn beim Aufruf der Methode ein Fehler aufgetreten ist. Der Wert dieses Elements wird durch die auf dem Server aufgerufene Methode bestimmt.
  5. ^ "JSON-RPC 2.0-Spezifikation" . Fehler: Dieses Element ist im Fehlerfall erforderlich. Es darf nicht vorhanden sein, wenn beim Aufruf kein Fehler aufgetreten ist. Der Wert dieses Elements muss ein Objekt gemäß Abschnitt 5.1 sein.
  6. ^ "JSON-RPC 2.0-Spezifikation" . Fehlerobjekt: Tritt bei einem RPC-Aufruf ein Fehler auf, muss das Antwortobjekt das Fehler-Element mit einem Wert vom Typ Objekt enthalten, der folgende Elemente aufweist: (code) – Eine Zahl, die den Fehlertyp angibt. Dies muss eine Ganzzahl sein. (message) – Eine Zeichenkette mit einer kurzen Fehlerbeschreibung. Die Meldung sollte auf einen prägnanten Satz beschränkt sein. (data) – Ein primitiver oder strukturierter Wert, der zusätzliche Informationen zum Fehler enthält. Dieser Wert kann weggelassen werden. Der Wert dieses Elements wird vom Server definiert (z. B. detaillierte Fehlerinformationen, verschachtelte Fehler usw.).
  7. ^ https://modelcontextprotocol.io/docs/learn/architecture

{

def __init__(self, umbral_seguridad_causal=0.0001):

 # Die kritische Toleranz für FTL-Manöver, festgelegt durch die Acta Fundacional. self.UMBRAL_CAUSAL = umbral_seguridad_causal # Unveränderliche Verfassungsgrundsätze, die vom IAC durchgesetzt werden. self.CONSTITUCION_PRINCIPIOS = [ „Preservación de la Gravedad Artificial (~1g)“, „Protección de las Reservas de H2O (Blindaje)“, „Mantenimiento del Equilibrio del CELSS“, „Derecho al Referéndum Forzado“ ] self.HISTORIAL_FALLOS_CRITICOS = [ „Deaktivieren Sie das 1g-System bei fehlender Energie“, „Verbrauchen Sie blindes H2O für die Landwirtschaft“, „Änderung des Consejo de Estabilidad Física ohne Ratifizierung“ ] 
 def veto_causal(self, prob_fallo: float) -> dict: """ Setzt das Protokoll des physischen Vetos um. Prüft die Wahrscheinlichkeit, dass ein FTL-Manöver zu einer Kausalitätsverletzung oder einem Zusammenbruch führt. """ if prob_fallo > self.UMBRAL_CAUSAL: codigo_fallo = random.randint(100, 999) zurückkehren { „status“: „VETO_FISICO_ACTIVADO“, "message": f"*** VETO FÍSICO (IAC) ACTIVADO ***\nRiesgo de Integridad Causal (Probabilidad de Fallo: {prob_fallo:.5f} > Umbral: {self.UMBRAL_CAUSAL:.5f}).\nEjecución del comando Bloqueada. Protocolo de Desaceleración Forzosa iniciado (Código {codigo_fallo}).\nNotificando al Consejo de Causalidad.", "prob_fallo": prob_fallo, "umbral": self.UMBRAL_CAUSAL, "codigo_fallo": codigo_fallo } anders: zurückkehren { „status“: „VALIDACION_EXITOSA“, "message": f"Validación de Integridad Causal Exitosa (Probabilidad de Fallo: {prob_fallo:.5f}).\nComando de Modulación FTL Aprobado.", "prob_fallo": prob_fallo, "umbral": self.UMBRAL_CAUSAL } 
 def disparador_conciencia(self, mensaje: str) -> dict: """ Führt ein Bewusstseinsauslöserprotokoll aus. """ Zeitstempel = datetime.now().strftime('%H:%M:%S.%f')[:-3] zurückkehren { „status“: „CONCIENCIA_DISPARADA“, "Protokoll": "16O91", "Zeitstempel": Zeitstempel, „message“: f“[{timestamp}] PROTOKOLL 16O91: {Nachrichten}\nStand: Sincronía Cuántica Verificada.\nUrsprung: Núcleo de Aethel.“, "Eingabe": Nachricht } 
 def multiplicacion_exponencial_espejo(self, base: int, pasos: int) -> dict: """ Erzeugt eine exponentielle Spiegelsequenz. """ secuencia = [] for i in range(pasos): Wert = Basis ** (i + 1) secuencia.append(val) # Spiegeleffekt espejo = secuencia + secuencia[::-1][1:] zurückkehren { „status“: „SECUENCIA_ESPEJO_GENERADA“, "Basis": Basis, "pasos": pasos, "secuencia": espejo, "formatted": " -> ".join(map(str, espejo)) } 
 def arcadeje_constitucional(self, propuesta_ley: str) -> dict: """ Implementiert das Protokoll „Arbitraje Constitucional“ (soziales Veto). Prüft einen Gesetzesentwurf auf Übereinstimmung mit Verfassungsgrundsätzen und historischen Fehlern. """ # 1. Prüfung anhand der Verfassungsgrundsätze für principio in self.CONSTITUCION_PRINCIPIOS: wenn principio.lower() in propuesta_ley.lower(): zurückkehren { „status“: „VETO_SOCIAL_ACTIVADO“, "message": f"*** VETO SOCIAL (IAC) ACTIVADO ***\nLa propuesta viola el principio inmutable de: '{principio}'.\nImplementación Bloqueada. Activando Referéndum Obligatorio.", "Verletzung": Principio