我正在使用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以删除它的想法,而不知道它是否存在。
答案 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请求。如果在没有严格编辑请求的情况下无效,那么上述方法是合理的。