java - 从 SOAP 请求中删除命名空间

标签 java delphi visual-studio-2010 soap delphi-2007

我导入了 WSDL 并使用它发送 SOAP 请求。它看起来像这样:

<?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>
        <Calculate xmlns="urn:xx.WSDL.xxxxxWebService">
            <ContractdocumentIn>
                <AL>
                ...More XML...

问题出在 Calculate 元素中的 xmlns="urn:xx.WSDL.xxxxxWebService" 部分。 Web 服务不能接受这个。 Web 服务不喜欢这样的 namespace ...
使用SoapUI我发现这个请求工作得很好:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:col="http://example.com.service.xxx/">
    <SOAP-ENV:Body>
        <col:Calculate>
            <ContractdocumentIn>
                <AL>
                    ...More XML...

那么,如何将请求从第一个版本更改为第二个版本? (不使用肮脏的技巧!)
(如果这会产生正确的请求格式,则重新导入不是问题。)




再次强调:不允许使用肮脏的把戏,比如破解请求流来修改它!


虽然我还没有完全测试它,但似乎 C#/VS2010 和 Delphi 2010 也无法使用我尝试调用的 Web 服务。似乎是用 Java 编写的 Web 服务。 SoapUI恰好是用 Java 编写的,因此我们有一个 Java 客户端与 Java 服务对话,这似乎工作得很好。但是还有其他客户吗?
无论如何,是时候添加两个标签了:“Java”,因为它是一个 Java 服务,以及“vs2010”,因为 .NET 也不喜欢这个服务。
我正准备在 .NET 中围绕这个服务编写一个包装器,希望这会奏效......它没有。所以这是一个非常严重的缺陷,可能是 Java 缺陷......

最佳答案

如果服务期望:

  <col:Calculate>
     <ContractdocumentIn>
         <AL>

Delphi SOAP 正在发送...

    <Calculate xmlns="urn:xx.WSDL.xxxxxWebService">
        <ContractdocumentIn>
            <AL>

...问题是 ContractdocumentIn 是一个不合格的元素,并且(直到 Delphi XE)Delphi SOAP 不支持作为操作的顶级元素的不合格元素。顶级元素是函数的参数,没有地方可以存储底层元素必须不合格的事实;对于映射到属性的元素,我们使用属性的索引来存储 IS_UNQL 标志。

顺便说一句,没有必要使用前缀。该服务将(应该)还接受:

    <Calculate xmlns="urn:xx.WSDL.xxxxxWebService">
        <ContractdocumentIn xmlns="">
            <AL>

后者更冗长,但它等同于前缀大小写。

在 Delphi XE 中,导入器存储了特定参数映射到非限定元素的事实,并且运行时根据此信息进行操作。最近在一个线程中出现时,我已经在新闻组中发布了基于 D2010 和 D2007 的 XE 实现的补丁:

https://forums.embarcadero.com/thread.jspa?threadID=43057

如果有人需要访问它们(它们在附件区域但可能已经滚出),请给我发电子邮件,我会让它们可用。 [embarcadero.com 上的 bbabet]

干杯,

布鲁诺

关于java - 从 SOAP 请求中删除命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4154585/

相关文章:

java - 将 KeyListener 添加到 Jframe 问题

java - 支柱2 : Send a JSON string with JQuery ajax submit to be mapped into a List of complextypes

java try catch 程序流程什么时候中断?

delphi - 如何以Threaded方式处理Log

java - 如何使用java访问我电脑中的另一台电脑mysql数据库(距离50公里)

c - 为 Delphi 中的 C 回调提供指向函数的指针

delphi - 如何使用DLL中包含的标志?

c# - 要使用多少线程?

visual-studio-2010 - x64 上的 Visual Studio 2010 是否经常崩溃?或者只是在我的电脑上?

c# - 从 Internet 获取汇率