Delphi使用<schema>标记</schema>在SOAP请求中包装TXMLData

时间:2012-09-06 20:32:11

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

我正在使用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以删除它的想法,而不知道它是否存在。

3 个答案:

答案 0 :(得分:1)

看起来Delphi会查看<MyXML>并认为

  

“这段XML没有关联的命名空间,所以我只是   将它放在XMLSchema命名空间中 - 嘿!,这个命名空间不是   但是在SOAP消息的名称空间中,所以我将它添加到make   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文档,在根元素中具有名称空间声明(而不是像您的情况那样单独的外部元素)。

答案 1 :(得分:1)

解决。

Delphi将webservice映射为:

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>

我需要发送的内容。

答案 2 :(得分:0)

听起来你有一个不合规的网络服务,你必须点击,但SOAP库正在阻碍。因此,您可能需要采用“强力”方法来替换OnBeforeExecute处理程序中的请求。 在此之前,我尝试使用SoapUI来使用服务WSDL。查看服务是否接受SoapUI请求。如果在没有严格编辑请求的情况下无效,那么上述方法是合理的。