0

サーバー側の拡張ポイントの1つに「プラグイン」された独自のメソッドとクライアント側のJQuery AJAXリクエストを使用して、trac XMLRPCPluginを使用してJSON RPC経由でいくつかのデータにアクセスしようとしています。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 の Same Origin Policy による問題ではないと思います。リクエストは私のマシン上にある私の trac テストベッドに対するものだからです。ただし、メイン ネットワーク内にあるサーバーにプラグインが展開されると、これは問題になります。

問題が Same Origin Policy に関係していない場合、その原因を知っている人はいますか?

4

2 に答える 2

0

問題は、実際にパラメータとして送信しているものにある可能性があります。

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

ここで説明されているソリューションを試してください: JqueryAjaxWebサービスへのjsonの投稿

于 2012-07-25T15:20:49.980 に答える
0

呼び出しは入力を 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ない限り、URLを使用します。anonymousXML_RPC

于 2012-07-26T19:27:00.727 に答える