Domanda

Sto cercando di accedere ad alcuni dati tramite JSON RPC utilizzando il TRAC XMLRPCPlugin utilizzando il mio metodo "collegato" in uno dei suoi punti di estensione sul lato server e una richiesta JQuery Ajax sul lato client. Posso accedere ai dati multa utilizzando l'estensione del poster di Firefox tuttavia utilizzando la richiesta JQuery Ajax fornisce un messaggio di errore. Il messaggio di errore che ottengo è:

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}
.

La richiesta JQuery è:

 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);
   }      
.

La richiesta che ho lavorato tramite poster è semplicemente "{" metodo ":" Breq.getbreqs "}" con contenuto impostato su Application / JSON e l'URL uguale come sopra.

Ho letto alcuni post su questo problema se utilizzato con un proxy PHP e ha provato la registrazione della richiesta in PARES_RPC_REQUEST nel plugin RPC Trac, ma questo ha restituito la stessa stringa di "" per il funzionamento e il non funzionamento Richieste.

Non penso che questo sia un problema a causa della stessa politica di origine di JavaScript in quanto la richiesta è al mio TRAC TestBed che è sulla mia macchina. Tuttavia, una volta che il plugin viene distribuito su un server ancora all'interno della rete principale, questo diventerà un problema e in caso affermativo, come dovrei affrontarlo?

Se il problema non ha a che fare con la stessa politica di origine Qualcuno sa cosa lo sta causando?

È stato utile?

Soluzione

La tua chiamata URL codificherà l'ingresso, che non è quello che vuoi per JSON-RPC.Volete che il corpo di richiesta sia una stringa JSON senza caratteri o informazioni aggiunti.

Ecco una nuova versione del tuo snippet che carica fine da una console JavaScript Browser, ma nota che il mio esempio chiama system.listMethods (e non il tuo metodo personalizzato) in modo che funzioni per qualsiasi installazione di RPC TRAC:

$.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);
   }
});
.

Utilizzare /login/rpc URL a meno che anonymous abbia assegnato il permesso XML_RPC.

Altri suggerimenti

Il problema potrebbe essere in ciò che invii effettivamente come parametro:

data: {"method": "breq.getBreqs"}
.

Prova la soluzione descritta qui: JQuery Ajax Posting JSON a WebService

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top