如何从调用中删除SOAP命名空间

时间:2014-01-17 13:08:43

标签: php xml soap

我正在尝试使用PHP SOAP连接到WSDL Web服务。现在我需要从发送的XML中删除SOAP元素。我现在拥有以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
               xmlns:ns1="http://service.com">
<SOAP-ENV:Body>
    <ns1:Calculate>
        //Content
    </ns1:Calculate>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

我想要的是以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<ns1:Calculate xmlns:ns1="http://service.com">
    //Content
</ns1:Calculate>

有没有办法实现这个目标? SOAP是我需要发送此类请求的那个吗?

3 个答案:

答案 0 :(得分:0)

SOAP是协议,如果您想要SOAP请求,客户端和服务器端都必须接受并根据此协议发回请求。 只需检查以下设置:

$client = new SoapClient("some.wsdl", array('soap_version'   => SOAP_1_2));

服务器可能使用1_2或1_1版本。 您应该与Web服务提供商联系以获取有关Web服务实现的文档。

答案 1 :(得分:0)

使用自定义的SoapClient覆盖__doRequest类。新方法从XML中删除名称空间引用,然后调用父级的__doRequest用修改后的XML满足请求。一个简单但有效的解决方案。

class MySoapClient extends SoapClient
{
        public function __doRequest($request, $location, $action, $version, $one_way=0)
        {
             $xml = str_replace('ns1:', '', $xml);
             parent::__doRequest($xml, $location, $action, $version, $one_way);
        }
}

# Invoke derived class instead of base class SoapClient
$client = new MySoapClient($wsdl, $options);

答案 2 :(得分:-1)

如果要发出SOAP请求,则需要这些标记。是否真的在你的对面试图提出请求的SOAP服务器?