【问题标题】:XML-RPC giving error while extracting ticket info from Trac从 Trac 提取票证信息时 XML-RPC 出错
【发布时间】:2014-06-20 06:54:23
【问题描述】:

我正在使用 Java 中的 XML-RPC 插件从 Trac 中提取票证信息。

到目前为止,我使用以下代码成功

     config.setBasicUserName ("username");
     config.setBasicPassword ("password");
     config.setServerURL (new URL ("trac_url"));

     client = new XmlRpcClient();
     client.setConfig (config);

     Object [] params = new Object [] {};
     Object [] queryResult = null;

     try {
         queryResult = (Object []) client.execute ("ticket.query", params);

     } catch (XmlRpcException e) {
         System.out.println(e.getMessage());
         System.out.println(e.code);
         System.out.println(e.linkedException);
         System.out.println(e.getCause());
         e.printStackTrace();
     }

但是当我将 url 更改为另一个项目时,它只会给出错误消息

供您参考,当我使用相同的 url 在浏览器中打开时,该 url 运行良好,我可以在那里看到门票,但它在程序中不起作用

上面的代码我得到了这个

    ????????? XML_RPC ???????    // from  System.out.println(e.getMessage());
    1  // from System.out.println(e.code);
    org.apache.xmlrpc.XmlRpcException: ????????? XML_RPC ???????
    at org.apache.xmlrpc.client.XmlRpcStreamTransport.readResponse(XmlRpcStreamTransport.java:197)
    at org.apache.xmlrpc.client.XmlRpcStreamTransport.sendRequest(XmlRpcStreamTransport.java:156)
    at org.apache.xmlrpc.client.XmlRpcHttpTransport.sendRequest(XmlRpcHttpTransport.java:143)
    at org.apache.xmlrpc.client.XmlRpcSunHttpTransport.sendRequest(XmlRpcSunHttpTransport.java:69)
    at org.apache.xmlrpc.client.XmlRpcClientWorker.execute(XmlRpcClientWorker.java:56)
    at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:167)
    at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:137)
    at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:126)
    at xmlropx.ListTracTicket.extractDataFromTrac(ListTracTicket.java:206)
    at xmlropx.ListTracTicket.main(ListTracTicket.java:263)
    null   // from  System.out.println(e.linkedException);
    null   // from  System.out.println(e.getCause());

请帮我解决这个问题

【问题讨论】:

  • 您是否测试过您可以在出现错误的网站上通过/login/rpc 进行身份验证?这将确认 XmlRpc 已安装并且用户具有适当的权限。
  • @RjOllos 是的,我可以使用浏览器成功登录并查看门票
  • 您的帐户可能没有被标记为对该 Trac 实例的 XMLRPC 权限。您可以访问 Trac 的日志文件吗?这应该提供更多关于发生了什么的细节。

标签: java xml-rpc trac


【解决方案1】:

您似乎在 Trac 服务器(例如 Apache Httpd)上有一些关于第二个 url 的特定配置。您可以尝试其他方法来获取网址。也许它会产生更详细的异常或其他东西。

我尝试通过常规的“URL”/“URLConnection”java 类使用 Trac,它工作正常,而且您还可以控制整个过程,因为 http/rpc 的东西是低级实现的。

唯一棘手的是票证版本时间戳 - 它应该被指定为 RPC 票证修改方法的附加参数。

一个简短的例子。

public static JSONObject sendJsonRpc(String method, JSONArray parameters) throws IOException, JSONException {

    JSONObject rpc = new JSONObject();
    rpc.put("method", method);
    rpc.put("params", parameters);
    rpc.put("id", jsonIdSequence++);

    String tracUrl = Configuration.getTracApiUrl();
    String tracUsername = Configuration.getTracApiUsername();
    String tracPassword = Configuration.getTracApiPassword();

    URL url = new URL(tracUrl);
    URLConnection conn = url.openConnection();
    String userpass = tracUsername + ":" + tracPassword;
    String basicAuth = "Basic " + new String(new Base64().encode(userpass.getBytes()));
    conn.setRequestProperty ("Authorization", basicAuth);
    conn.setRequestProperty ("Content-Type", "application/json");
    conn.setDoOutput(true);

    OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());

    Logger.debug("jsonrpc request:\n" + rpc.toString());

    wr.write(rpc.toString());
    wr.flush();
    wr.close();

    BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    String line;
    String jsonText = "";
    while ((line = rd.readLine()) != null) {
        jsonText += line;
    }
    rd.close();

    Logger.debug("jsonrpc response:\n" + jsonText);

    return new JSONObject(jsonText);
}

您可以在Java, Trac, RPC and JSON 找到更多示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 1970-01-01
    相关资源
    最近更新 更多