【问题标题】:Setting up a Java XML-RPC Servlet设置 Java XML-RPC Servlet
【发布时间】:2016-08-16 11:06:06
【问题描述】:

我必须创建一个 Java webapp 来侦听传入的 HTTP POST 请求,然后检索请求正文中包含的 XML 以便处理它。 我正在使用 Maven 4、Hibernate 3 和 XML-RPC 服务器。我使用 Maven 成功导入了 XML-RPC jar 文件。

虽然每个人似乎都说 XML-RPC 是世界上最简单的东西,但我很难实现它。我对 webapps 很陌生。 查看 Apache XML-RPC 教程,我知道我需要创建一个类,例如:

public class MyServer extends XmlRpcServlet {
    private XmlRpcServer server = new XmlRpcServer();
    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        server.addHandler("myProcess", new MyProcessHandler);
        byte[] result = server.execute (request.getInputStream());
        response.setContentType ("text/xml");
        response.setContentLength (result.length());
        OutputStream out = response.getOutputStream();
        out.write (result);
        out.flush ();
    }
}

但这不会编译,因为“execute”方法需要一个 XmlRpcRequest 参数。关于我做错了什么的任何提示?

除此之外,我不明白如何从函数 myProcess() 中获取请求的正文。我有一个实现 myProcess() 函数的 MyProcessHandler 类(不扩展类)。我需要在这个函数中添加一个参数吗?那么是什么类型呢?

【问题讨论】:

    标签: java servlets xml-rpc


    【解决方案1】:

    你可以使用XmlRpcServletServer(apache xml-rpc 3.1.3):

    public class EmbeddedXmlRpc extends HttpServlet
    {
      ...
      protected XmlRpcServletServer server = new XmlRpcServletServer();
      ...
      server.setHandlerMapping(phm);
      ...
      protected void processRequest(HttpServletRequest request, HttpServletResponse response)
       throws ServletException, IOException
      {
        server.execute(request, response);
      }
    }
    

    【讨论】:

      【解决方案2】:

      主要问题在于 XML-RPC 版本:Apache 首先制作了一个名为 helma-xmlrpc 的旧版本,然后将其重构为 org.apache.xmlrpc。尽管 Apache 更新了其 XML-RPC 在线文档的某些部分,但其他一些部分仍然引用 helma-xmlrpc,并且在每个页面上都没有提示使用的版本。

      此外,Apache 表示使用 helma-xmlrpc 的项目只需更新其导入即可使用新版本 org.apache.xmlrpc,不会影响代码 - 这是完全错误的。一些方法甚至一些类消失了,或者签名改变了,一些类被放入了子目录,所以导入不再起作用了。

      好的。所以一旦我弄清楚了,我也明白了大多数处理 Apache XML-RPC 的 Internet 教程都使用旧的 helma-xmlrpc 版本,但将它们的导入显示为 org.apache.xmlrpc。因此,如果您将其粘贴到您自己的使用 org.apache.xmlrpc 的项目中,它们提供的实现将不起作用。它甚至没有编译。

      我在 Internet 上查找了最新的 org.apache.xmlrpc-implementation-with-servlets 教程,但没有任何结果。因此我决定使用旧的 helma-xmlrpc 并且一切顺利。使用 Helma,我在第一条消息中发布的代码现在可以编译并且是正确的。

      至于监听器和MyProcessHandler类之间的联系,多亏了addHandler函数才存在。声明处理程序后,在处理指令 server.execute(...) 时,所有带有 methodName 之类的传入请求都会自动重定向到 MyProcessHandler.myFunction()。

      为此,myFunction() 必须声明一个字符串输入参数。当调用 myFunction() 时,此参数包含请求的主体(由 servlet 中的 request.getInputStream() 提取)。 myFunction() 也必须返回一些东西,它会被返回到 servlet 的 byte[] 结果变量中。

      我很好地利用了下面的链接,非常完整,只处理了 helma-xmlrpc,没有假装使用 org.apache.xmlrpc...:http://www.perfectxml.com/oreilly/chapter.asp?row_id=11

      我希望这个答案足够清楚(我的英语口语并不完美......),它会帮助其他开发人员了解 Apache XML-RPC。

      【讨论】:

        猜你喜欢
        • 2010-11-07
        • 1970-01-01
        • 2011-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多