使用 JQuery AJAX 时跟踪 JSON RPC 问题

Posted

技术标签:

【中文标题】使用 JQuery AJAX 时跟踪 JSON RPC 问题【英文标题】:Trac JSON RPC Issue when using JQuery AJAX 【发布时间】:2012-07-25 14:07:59 【问题描述】:

我正在尝试使用 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 测试平台的。但是,一旦将插件部署到仍在主网络内的服务器上,这将成为一个问题,如果是这样,我应该如何处理它?

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

【问题讨论】:

【参考方案1】:

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

这是您的 sn-p 的新版本,可以从浏览器 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 URL,除非anonymous 已分配XML_RPC 权限。

【讨论】:

【参考方案2】:

问题可能出在您实际发送的参数中:

data: "method": "breq.getBreqs"

尝试此处描述的解决方案: Jquery Ajax Posting json to webservice

【讨论】:

谢谢罗伯托,这似乎取得了一些进展,但我现在有一个不同的错误。我的数据字段现在看起来像这样:data: JSON.stringify("method": "breq.getBreqs")。由于此处空间不足,我将在下面发布错误消息! ValueError: Extra data: line 1 column 1 - line 1 column 133 (char 1 - 133) 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: Extra data: line 1 column 1 - line 1 column 133 (char 1 - 133) Trac[json_rpc] DEBUG: RPC(json) encoded response: "error": "message": "JsonProtocolException details : Extra data: line 1 column 1 - line 1 column 133 (char 1 - 133)", "code": -32700, "name": "JSONRPCError", "result": null, "id": null 我已经成功记录了正在发送的数据,它看起来像这样:0=%7B&amp;1=%22&amp;2=m&amp;3=e&amp;4=t&amp;5=h&amp;6=o&amp;7=d&amp;8=%22&amp;9=%3A&amp;10=%22&amp;11=b&amp;12=r&amp;13=e&amp;14=q&amp;15=.&amp;16=g&amp;17=e&amp;18=t&amp;19=B&amp;20=r&amp;21=e&amp;22=q&amp;23=s&amp;24=%22&amp;25=%7D。大概这应该是 JSON 而不是这个,所以有没有什么特别的东西导致了这个?

以上是关于使用 JQuery AJAX 时跟踪 JSON RPC 问题的主要内容,如果未能解决你的问题,请参考以下文章

带有SMTP的AJAX jQuery JSON PHPMailer

当使用servlet输出json时,浏览器端jquery的ajax遇到parse error的问题

从 jQuery Ajax 发布时 PHP Json 格式错误

什么是Ajax ,异步,同步,JSON,XMLHttpRequest对象,什么是JSON,使用JQuery实现Ajax

jQuery 不会从 AJAX 查询中解析我的 JSON

一个轻量级且非常可配置的jQuery插件,用于使用ajax(同步)上传文件;包括对队列、进度跟踪和拖放的支持。