Verfolgen Sie das JSON-RPC-Problem bei der Verwendung von JQuery AJAX
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?
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