2

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

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

MyService.ExecuteRequest(RequestData);

我使用了 THTTPRIO 的 OnBeforeExecute 来获取请求的内容,并且内容被包装在一个标签中,如下所示:

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

我不知道为什么要添加这个标签。我怎样才能防止它被添加?

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

4

3 回答 3

1

解决了。

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 使用“RequestData”作为请求正文中 XML 的顶部节点,而不是添加模式标记。

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

<RequestData>[MyXML]</RequestData>

这是我需要发送的。

于 2012-09-10T16:19:42.130 回答
1

看起来德尔福看着<MyXML>并认为

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

  • 请注意,在您的示例<MyXML>中不是格式良好的 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 文档(而不是在您的情况下是单独的外部元素)。

于 2012-09-07T12:44:39.607 回答
0

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

于 2012-09-07T12:28:34.223 回答