我在尝试通过Delphi访问Web服务时遇到问题。我使用2007版WSDLimp工具使用了一个java WSDL,看起来它正确地创建了所有对象。当我制作测试程序但是调用服务时,每个对象都是空的。如果我在HTTPRIOAfterExecute方法中转储SOAPResponse对象,我可以看到我已经找回了一个格式正确的XML Soap数据包,其中包含我期望的所有数据,但我无法通过对象访问它。那么有什么我想念的吗?
答案 0 :(得分:1)
如果在Delphi 2007中它适用于您,您可以使用更新的SOAP运行时在Delphi 2005中使用它。
答案 1 :(得分:1)
Web服务响应包含每个属性的别名命名空间。这些别名未在WSDL中定义。例如,WSDL包含一个名为“http://www.example.com/SomeService”的命名空间,并且该请求在顶级节点中以xmlns:ns3 =“http://www.example.com/SomeService”的形式即时别名。因此,响应中的属性看起来像ns3:somePropertyName =“[value]”。
在OPToSOAPDomConv单元中,在TSOAPDomConv.InitObjectFromSOAP中,它试图查找没有名称空间前缀的属性名称。这导致查找失败并将对象属性留空。即使使用2007源文件也会发生这种情况。
我能看到的最好的解决方法是修改InitObjectFromSOAP例程。
在第4181行附近,添加:
RemTypeRegistry.InfoToURI(PropList[i].PropType^, NS, PropName, IsScalar);
并更改AttrNode.HasAttribute以将NS变量作为第二个参数传递,如下所示:
if AttrNode.HasAttribute(ExternalPropName, NS) then
另外,几行是SetObjectPropFromText调用。最后一个参数是属性值,您需要将Attr.Attributes [ExternalPropName]更改为
SetObjectPropFromText(Instance, PropList[I], AttrNode.GetAttributeNS(ExternalPropName, NS))
当然要声明NS,PropName和IsScalar变种。
答案 2 :(得分:0)
答案 3 :(得分:0)
我重新阅读了这个问题以及它是一个Java Web服务让我记住了一些事实。
确保使用最新的WSDLImp和SOAP单元。在导入的单元中查找对RegisterInvokeOptions的调用。第二个参数应该是ioDocument。如果将此更改为ioDefault会发生什么。
我记得有一篇帖子提到了这个用于Java NetBeans(可能是?)Web服务的帖子,但还没有尝试过。