【问题标题】:Delphi send array of string to java web service always be emptyDelphi 将字符串数组发送到 Java Web 服务始终为空
【发布时间】: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


【解决方案1】:

我可以用 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);
    }
}

另见:Delphi and Java Integration using Web Services

【讨论】:

    【解决方案2】:

    我使用 NetBeans 7.2 和 Metro 2.0(.NET 3.5/Metro 1.3 兼容)编写 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。

    那么,还有其他方法可以纠正这个问题吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      • 2011-08-28
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多