Frage

Ich versuche, über JSON RPC auf einige Daten zuzugreifen, indem ich das XMLRPCPlugin trac verwende, indem ich meine eigene Methode an einen seiner Erweiterungspunkte auf der Serverseite „einstecke“ und eine JQuery-AJAX-Anfrage auf der Clientseite verwende.Ich kann mit der Firefox-Poster-Erweiterung problemlos auf die Daten zugreifen, bei der Verwendung der JQuery-Ajax-Anfrage wird jedoch eine Fehlermeldung angezeigt.Die Fehlermeldung, die ich bekomme, ist:

Trac[web_ui] DEBUG: RPC incoming request of content type 'application/json' dispatched 
to <tracrpc.json_rpc.JsonRpcProtocol object at 0x03CA51F0>
Trac[web_ui] DEBUG: RPC(JSON-RPC) call by 'PaulWilding'
Trac[json_rpc] ERROR: RPC(json) decode error 
Traceback (most recent call last):
  File "build\bdist.win32\egg\tracrpc\json_rpc.py", line 148, in parse_rpc_request
    data = json.load(req, cls=TracRpcJSONDecoder)
  File "C:\Python27\Lib\json\__init__.py", line 278, in load
    **kw)
  File "C:\Python27\Lib\json\__init__.py", line 339, in loads
    return cls(encoding=encoding, **kw).decode(s)
  File "build\bdist.win32\egg\tracrpc\json_rpc.py", line 99, in decode
    obj = json.JSONDecoder.decode(self, obj, *args, **kwargs)
  File "C:\Python27\Lib\json\decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Python27\Lib\json\decoder.py", line 384, in raw_decode
    raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded
Trac[web_ui] ERROR: RPC(JSON-RPC) Error
Traceback (most recent call last):
  File "build\bdist.win32\egg\tracrpc\web_ui.py", line 143, in _rpc_process
    rpcreq = req.rpc = protocol.parse_rpc_request(req, content_type)
  File "build\bdist.win32\egg\tracrpc\json_rpc.py", line 162, in parse_rpc_request
    raise JsonProtocolException(e, -32700)
JsonProtocolException: No JSON object could be decoded
Trac[json_rpc] DEBUG: RPC(json) encoded response: {"error": {"message": "JsonProtocolException details : No JSON object could be decoded", "code": -32700, "name": "JSONRPCError"}, "result": null, "id": null}

Die JQuery-Anfrage lautet:

 url: "http://localhost/Projects/jsonrpc",
   contentType: "application/json",
   dataType: "jsonp",
   data: {"method": "breq.getBreqs"},
   type: 'POST',
   success: function (repsonse) {
          alert("success");
   },
   error: function (jqXHR, textStatus, errorThrown) {
          alert("Error: " + textStatus);
   }      

Die Anfrage, die ich bei der Arbeit mit Poster erhalten habe, lautet einfach „{“Methode“:„breq.getBreqs“}“ mit auf application/json eingestelltem Inhalt und der gleichen URL wie oben.

Ich habe ein paar Beiträge zu diesem Problem bei Verwendung mit einem PHP-Proxy gelesen und versucht, die Anfrage im parse_rpc_request im Trac-RPC-Plugin zu protokollieren, aber dies hat nur die gleiche Zeichenfolge „“ für die funktionierenden und nicht funktionierenden Anfragen zurückgegeben.

Ich glaube nicht, dass dies aufgrund der Same Origin-Richtlinie von Javascript ein Problem darstellt, da die Anfrage an mein Trac-Testbed gerichtet ist, das sich auf meinem Computer befindet.Wird das Plugin jedoch zu einem Problem, wenn es auf einem Server bereitgestellt wird, der sich noch im Hauptnetzwerk befindet, und wenn ja, wie soll ich damit umgehen?

Wenn das Problem nicht mit der Same-Origin-Richtlinie zusammenhängt, weiß jemand, was es verursacht?

War es hilfreich?

Lösung

Ihr Aufruf wird die Eingabe per URL kodieren, was für JSON-RPC nicht das ist, was Sie wollen.Sie möchten, dass der Anforderungstext eine JSON-Zeichenfolge ohne hinzugefügte Zeichen oder Informationen ist.

Hier ist eine neue Version Ihres Snippets, die problemlos von einer Browser-Javascript-Konsole geladen werden kann. Beachten Sie jedoch, dass mein Beispiel aufgerufen wird system.listMethods (und nicht Ihre benutzerdefinierte Methode), damit es für jede Trac RPC-Installation funktioniert:

$.ajax({
   url: "http://localhost/trac/rpc",
   contentType: "application/json",
   dataType: "text",
   data: JSON.stringify({method: "system.listMethods", id: 42}),
   type: 'POST',
   success: function (response) {
       incoming = JSON.parse(response)
       alert("Result ID " + incoming["id"] + ": " + incoming["result"]);
   },
   error: function (jqXHR, textStatus, errorThrown) {
       alert("Error: " + textStatus);
   }
});

Verwenden /login/rpc URL, sofern nicht anonymous zugewiesen haben XML_RPC Erlaubnis.

Andere Tipps

Das Problem kann in dem sein, was Sie tatsächlich als Parameter senden: generasacodicetagpre.

Versuchen Sie die hier beschriebene Lösung: jquery ajax posteding json nach Webservice

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top