我正在尝试使用 trac XMLRPCPlugin 通过 JSON RPC 访问一些数据,使用我自己的方法“插入”到服务器端的扩展点之一和客户端的 JQuery AJAX 请求。我可以使用 Firefox 海报扩展很好地访问数据,但是使用 JQuery ajax 请求会给出错误消息。我收到的错误消息是:

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}

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

我通过 Poster 得到的请求只是“{"method":“breq.getBreqs”}”,内容设置为 application/json,URL 与上面相同。

我读过一些关于与 PHP 代理一起使用时出现此问题的文章,并尝试将请求记录在 trac rpc 插件的 parse_rpc_request 中,但这对于工作请求和非工作请求都只返回相同的“”字符串。

我不认为这是一个问题,因为 Javascript 的同源策略是针对我机器上的 trac 测试台的请求。但是,一旦插件部署到仍在主网络内的服务器上,这将成为一个问题,如果是,我应该如何处理?

如果问题与同源策略无关,有人知道是什么原因造成的吗?

有帮助吗?

解决方案

您的调用将对输入进行 URL 编码,这不是您想要的 JSON-RPC。您希望请求正文是不添加字符或信息的 JSON 字符串。

这是代码片段的新版本,可以从浏览器 JavaScript 控制台正常加载,但请注意,我的示例调用 system.listMethods (而不是您的自定义方法),以便它适用于任何 Trac RPC 安装:

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

使用 /login/rpc 网址除非 anonymous 已分配 XML_RPC 允许。

其他提示

问题可能出在您实际作为参数发送的内容:

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

尝试此处描述的解决方案:Jquery Ajax 将 json 发布到 web 服务

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top