【发布时间】:2012-09-07 10:41:32
【问题描述】:
我在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); 没有帮助。
【问题讨论】:
-
您在 NetBeans 中使用哪个 Web 服务工具包(JAX-WS、Axis、Axis2、Apache XCF ...)?
-
您使用的是哪个版本的 Delphi,您是否升级了 SOAP 库?例如,我使用的是 Delphi2005,但使用的是 Delphi XE2 的 SOAP 库。在此过程中对 SOAP 进行了许多修复,因此您的体验会因版本而异。
-
Delphi 中的 SOAP 支持并不是它的亮点之一,恕我直言 - 如果我在关键项目中遇到问题,我更喜欢编写一个 C# 代理应用程序,它一方面与 SOAP 服务对话,并公开一个简单的到 Delphi 世界的 HTTP 甚至基于文件的接口
-
不需要有命名空间前缀。 Delphi 生成的 XML 将标记放在默认命名空间中,这应该没问题。在我看来,消费者是不能正确处理命名空间的人,而不是生产者。
-
@RobKennedy Delphi 将有效负载(SOAP 正文内容)显式放入
http://hw.xzq.com/命名空间中。也许缺少标题是原因。
标签: arrays web-services delphi soap client