【问题标题】:Delphi wrapping TXMLData in SOAP request with <schema> tagDelphi 将 TXMLData 包装在带有 <schema> 标记的 SOAP 请求中
【发布时间】:2012-09-06 20:32:10
【问题描述】:

我正在使用 TXMLData 发送一个 XML,而 Delphi 在请求中添加了一个标签,我的代码是这样的:

RequestData := TXMLData.Create;
RequestData.LoadFromXML('<MyXML>[contents here]</MyXML>');

MyService.ExecuteRequest(RequestData);

我使用 THTTPRIO 的 OnBeforeExecute 来获取 Request 的内容,并将内容包装在一个标签中,如下所示:

<SOAP-ENV:Body>
    <schema xmlns="http://www.w3.org/2001/XMLSchema">
              <MyXML>
    </schema>
</SOAP-ENV:Body>

我不明白为什么要添加这个标签。如何防止它被添加?

另外,我不喜欢在 OnBeforeExecute 事件中编辑 SOAPRequest 以在不知道它是否存在的情况下将其删除。

【问题讨论】:

  • 那么,您要发送原始数据吗?
  • 我不知道这是否适合“原始”,我在 TXMLData 中加载了一个 XML,并希望这个 XML 在请求的正文中。但是 Delphi 用这个 标签包装了我的数据内容。
  • 您能更详细地解释您要完成的工作吗?现在还不清楚为什么schema 元素包装器会出现问题。
  • 我只需要将 xml 发送到网络服务。但是这个 web 服务的实现方式我需要发送确切的 xml,否则它不会验证。现在这个 标签使我对这个 web 服务的调用失败。我只需要按原样发送我在 TXMLData 变量中设置的 xml。
  • 在 SOAP 领域没有“只发送 XML”。 SOAP 嵌入了 XML,并且您不能在外部 XML 中拥有新的 XML 声明。所以你需要一些包装,封装,编码或其他。发布 WSDL:这至少应该提示必须如何包装 XML。

标签: web-services delphi soap schema delphi-xe2


【解决方案1】:

看起来Delphi看着&lt;MyXML&gt;并认为

"这段 XML 没有关联的命名空间,所以我只是 把它扔到 XMLSchema 命名空间 - 嘿!,这个命名空间不是 但在 SOAP 消息的命名空间中,所以我将添加它以使 SOAP 服务器很高兴!”

  • 请注意,在您的示例中,&lt;MyXML&gt; 不是格式良好的 XML 文档。它只是开始的“标签”。

我不知道 TXMLData 的详细信息,但它可能支持命名空间。也许您可以在 XML 文档中添加命名空间声明,然后 SOAP 请求会更好看。


SOAP 请求正文示例(来自Wikipedia):

<s:Body>
    <m:TitleInDatabase xmlns:m="http://www.lecture-db.de/soap">
        DOM, SAX and SOAP
    </m:TitleInDatabase>
</s:Body>

这表明 SOAP 主体可以是一个“独立”的 XML 文档,其名称空间声明位于根元素中(而不是像您的情况那样是单独的外部元素)。

【讨论】:

  • +1,我认为你的逻辑是正确的。问题是 delphi 生成的类型为 RequestType = TXMLData 并查看我的 XML 并说“哦,这个 XML 不是 TXMLData,让我更正它。”所以它添加了架构标签。当我声明一个从 TXMLData 继承的新类型时,它开始生成正确的 xml。
【解决方案2】:

解决了。

Delphi 将网络服务映射为:

RequestData = TXMLData;

MyService = interface(IInvokable)
  ['{5D2D1DD8-AE56-AD82-FC59-8669C576E1AF}']
  function ExecuteRequest(const RequestData: RequestData): RequestResult; stdcall;
end;

变化:

RequestData = TXMLData;

RequestData = class(TXMLData);

解决了这个问题。

现在delphi在请求的Body中使用“RequestData”作为XML的顶部节点,而不是添加架构标签。

现在调用正在生成如下内容:

<RequestData>[MyXML]</RequestData>

这是我需要发送的。

【讨论】:

    【解决方案3】:

    听起来您有一个不合规的 Web 服务,您必须使用它,但是 SOAP 库阻碍了您。因此,您可能需要诉诸“蛮力”方法来替换 OnBeforeExecute 处理程序中的请求。 不过,在此之前,我会尝试使用 SoapUI 来使用服务 WSDL。查看服务是否接受了 SoapUI 请求。如果不对请求进行严格的编辑,这不起作用,那么上述方法是合理的。

    【讨论】:

      猜你喜欢
      • 2011-09-22
      • 1970-01-01
      • 2015-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-15
      • 2019-05-15
      • 1970-01-01
      相关资源
      最近更新 更多