从Trac中提取票证信息时,XML-RPC会出错

时间:2014-06-20 06:54:24

标签: java xml-rpc trac

我在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更改为另一个项目时,它只会提供错误消息

为了您的信息,当我使用相同的网址在浏览器中打开时,网址运行正常,我可以看到那里的门票,但它在程序中不起作用

我为上面的代码

得到了这个
    ????????? 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());

请帮我解决这个问题

1 个答案:

答案 0 :(得分:0)

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

我尝试使用Trac而不是常规的'URL'/'URLConnection'java类,它可以正常工作,并且你也控制整个过程,因为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找到更多示例。