我必须创建一个Java webapp来侦听传入的HTTP POST请求,然后检索请求正文中包含的XML,以便对其进行处理。我使用的是Maven4、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类(它不扩展任何类)。是否需要在此函数中添加参数?那么它会是哪种类型呢?
发布于 2016-06-10 16:04:52
主要问题在于XML-RPC版本: Apache首先创建了一个名为helma-xmlrpc的旧版本,然后将其重构为org.apache.xmlrpc。尽管Apache更新了其XML-RPC在线文档的某些部分,但其他部分仍然引用helma-xmlrpc,并且在每个页面上都没有提示所使用的版本。
此外,Apache表示,使用helma-xmlrpc的项目只需更新导入即可使用新版本的org.apache.xmlrpc,这对代码没有任何影响--这是完全错误的。一些方法甚至一些类消失了,或者签名改变了,一些类被放到了子目录中,所以导入不再起作用。
好吧。因此,一旦我意识到这一点,我也了解到大多数处理Apache XML-RPC的互联网教程都使用旧的helma-xmlrpc版本,但将它们的导入显示为org.apache.xmlrpc。因此,如果您将其粘贴到使用org.apache.xmlrpc的自己的项目中,则它们提供的实现将不起作用。它甚至不能编译。
我在互联网上寻找最新的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。
发布于 2021-09-15 11:15:59
您可以使用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);
}
}https://stackoverflow.com/questions/36800227
复制相似问题