我在java中使用NetBeans编写一个简单的Web服务,一个函数接受一个字符串数组。 然后我用delphi写了一个web服务客户端并调用该函数,服务器总是收到一个空数组。
当我使用soapUI测试Web服务时,它会正常运行。
我检查了delphi客户端发送的xml内容,并与soapUI进行了比较。 这是由delphi客户端发送的:
<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SOAP-ENV:Body>
<helloList xmlns="http://hw.xzq.com/">
<helloList>line 1</helloList>
</helloList>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
这是由soapUI发送的:
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:hw="http://hw.xzq.com/">
<soapenv:Header/>
<soapenv:Body>
<hw:helloList>
<!--Zero or more repetitions:-->
<helloList>?</helloList>
</hw:helloList>
</soapenv:Body>
</soapenv:Envelope>
我将delphi客户端的xml内容复制到soapUI,服务器现在收到空数组。
我通过更改这三行修改了xml内容:
<hw:helloList xmlns:hw="http://hw.xzq.com/">
<helloList>line 1</helloList>
</hw:helloList>
之后,服务器收到了我的字符串数组。
所以,我认为问题是delphi客户端发送没有前缀命名空间的数组内容。 但是如何纠正这个? 谢谢你的帮助!
顺便说一句,评论一下 InvRegistry.RegisterInvokeOptions(TypeInfo(HelloWorld),ioDocument); 没有帮助。
答案 0 :(得分:0)
我可以使用NetBeans 7.2 / JAX-WS和Delphi 2009验证问题:
也许更新的Delphi版本可以处理这个(Delphi XE3可能是任何人)
我的Java代码:
@WebMethod(operationName = "example")
public void testArray(@WebParam(name = "arr") String[] arr) {
System.out.println("in web method");
System.out.println("Array has " + arr.length + " entries");
for (String s : arr) {
System.out.println(s);
}
}
答案 1 :(得分:0)
我使用带有Metro 2.0(兼容.NET 3.5 / Metro 1.3)的NetBeans 7.2编写Web服务,这是由delphi 7编写的客户端,安装了Delphi SOAP Runtime和Importer Update(24535)。
我认为问题是delphi客户端生成的xml与Web服务不兼容。
我想这可能会有所帮助,但我不知道如何在java中做同样的事情。
In the Server, to go to the SOAP web module, select the HTTPSoapPascalInvoker
component, and open up the Options property in the Object Inspector. Make sure
the option "soRootRefNodesToBody" is checked.
另一方面,我猜对Web服务使用“RFC”类型可能会有帮助,但RFC类型需要JAXB而不支持java.util.List。
那么,另一种方法可以纠正这个吗?