PHP SoapClient creating XML references for identical elements, makes it unacceptable for service

前端 未结 4 978
北恋
北恋 2020-12-19 08:17

I am working on a SOAP client in PHP, and the calls are going through to the service fine, with the exception of calls where there are elements that are identical to each ot

相关标签:
4条回答
  • 2020-12-19 08:38

    Hello You can try this fix:

    You need to extends the SoapClient and fix the generated request:

    You need to add the tags that are causing problems here

    $tags = ['Tag1', 'Tag2', 'Tag3'];
    

    And then use the MySoapClient instead of SoapClient

    class MySoapClient extends SoapClient {
    
    public function __construct($a, $b){
        parent::__construct($a, $b);
    }
    
    public function __doRequest($request, $location, $action, $version, $one_way = 0) {
    
        $tags = ['Tag1', 'Tag2', 'Tag3'];
        foreach($tags as $tag){
            if (preg_match("~<ns1:{$tag} id=\"ref(.+)\">(.+)</ns1:{$tag}>~ismU", $request, $matches)) {
                $ref = $matches[1];
    
                $request = str_replace([' id="ref'.$ref.'"'], '', $request);
    
                $tagValue = "<ns1:{$tag}>{$matches[2]}</ns1:{$tag}>";
                $request = str_replace("<ns1:{$tag} href=\"#ref{$ref}\"/>", $tagValue, $request);
            }
        }
        return parent::__doRequest($request, $location, $action, $version);
    }
    

    }

    0 讨论(0)
  • 2020-12-19 08:41

    In your PHP code make a property with unique index so the resulting XML will look like:

    <ns1:someelement>
      <ns1:name>name1</ns1:name>
      <ns1:value>value1</ns1:value>
      <ns1:index>0</ns1:value>
    </ns1:someelement>
    <ns1:someelement>
      <ns1:name>name1</ns1:name>
      <ns1:value>value1</ns1:value>
      <ns1:index>1</ns1:value>
    </ns1:someelement>
    

    Then PHP SoapClient will not make href references to the same copies of data and web service successfully ignored these unique fields in my case. No, I do not pass the same fields of someelement as reference in PHP code. They are cloned, however PHP SoapClient is smart enough to zip their multiple occurencies as references, unfortunately.

    0 讨论(0)
  • 2020-12-19 08:45
    • Make sure not use references
    • Try to add params manually with SoapParam
    • Try to add params manually with SoapVar

    $soapClient->__soapCall('Method', array(
        new SoapParam($someelement1, 'someelement'),
        // or
        new SoapVar('<ns1:someelement><ns1:name>name1</ns1:name><ns1:value>value1</ns1:value></ns1:someelement>', XSD_ANYXML)
    ));
    
    0 讨论(0)
  • 2020-12-19 08:59

    SoapClient makes a reference only when you use the same object on multiple XML nodes. Make for each place a new object if you do not want the references.

    0 讨论(0)
提交回复
热议问题