当前位置:  开发笔记 > 编程语言 > 正文

PHP SoapClient不处理WSDL中的abstract和substitutionGroup属性

如何解决《PHPSoapClient不处理WSDL中的abstract和substitutionGroup属性》经验,为你挑选了0个好方法。

我正在使用他们提供的wsdl向Canada Post发送一个电话,其中包含以下部分:







    
        
        
        
        
        
        
        
        
    

在他们的代码示例中,他们扩展了Soap类并覆盖了__doRequest()Soap方法,如下所示:

/*
 Need to override SoapClient because the abstract element 'groupIdOrTransmitShipment' is expected to be in the request in order for validation to pass.
So, we give it what it expects, but in __doRequest we modify the request by removing the abstract element and add the correct element.

*/

class MySoapClient extends SoapClient {

    function __construct($wsdl, $options = null) {
        parent::__construct($wsdl, $options);
    }

    function __doRequest($request, $location, $action, $version, $one_way = NULL) {
        $dom = new DOMDocument('1.0');
        $dom->loadXML($request);
        //get element name and values of group-id or transmit-shipment.
        $groupIdOrTransmitShipment =  $dom->getElementsByTagName("groupIdOrTransmitShipment")->item(0);
        $element = $groupIdOrTransmitShipment->firstChild->firstChild->nodeValue;
        $value = $groupIdOrTransmitShipment->firstChild->firstChild->nextSibling->firstChild->nodeValue;

        //remove bad element
        $newDom = $groupIdOrTransmitShipment->parentNode->removeChild($groupIdOrTransmitShipment);

        //append correct element with namespace
        $body =  $dom->getElementsByTagName("shipment")->item(0);
        $newElement = $dom->createElement($element, $value);
        $body->appendChild($newElement);

        //save $dom to string
        $request = $dom->saveXML();
        //echo $request;

        //doRequest
        return parent::__doRequest($request, $location, $action, $version);
    }
}

使用他们的overover方法可以正常工作,因为它改变了xml请求,但是为什么他们这样做会让我感到非常困惑.WSDL是否存在根本性的错误?这是PHP的SoapClient中的错误吗?我想要一种发送有效请求而不覆盖任何核心类方法的方法.

根据我的理解,作者想要一个group-id 一个transmit-shipment元素,但不是两个或没有.由于你不能在元素中有一个元素,根据w3c.org上的讨论,为此目的声明一个替换组应该没问题,并且在我的请求中只包含两个元素中的一个,但如果我只包括transmit-shipment并省略抽象元素groupIdOrTransmitShipmentphp返回错误:

SOAP-ERROR: Encoding: object has no 'groupIdOrTransmitShipment' property

更新: 这是非常古老但可能相关吗?https://bugs.php.net/bug.php?id=48570

推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有