我重写了phpSoapClient类,以便向元素添加一个属性。XML似乎已按预期更改,但在通过__getLastRequest查看XML时()XML看起来一点都没有改变。在代码中我试着给元素添加一个属性。也许有人知道为什么$request_new XML字符串没有发送到服务器?(OutputXML()只是一些很好的格式,可以转换为html)
class SoapClientDebug extends SoapClient
{
public function __doRequest($request, $location, $action, $version, $one_way = 0) {
// change / add whatever needed
$request_new = str_replace( '<env:Body', '<env:Body ns1:Id="TheBody"', $request );
// debug out
OutputXML($request_new);
// calling parent
return parent::__doRequest($request_new, $location, $action, $version, $one_way);
}
}
在调用parent__doRequest之前检查输出的XML
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://logius.nl/digipoort/koppelvlakservices/1.2/" xmlns:ns2="http://www.w3.org/2000/09/xmldsig#" xmlns:ns3="http://schemas.xmlsoap.org/soap/security/2000-12">
<env:Header>
<ns3:Security env:mustUnderstand="true">
<ns2:Signature>
<ns2:SignedInfo>
<ns2:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
<ns2:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
<ns2:Reference>
<ns2:Transforms>
<ns2:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
</ns2:Transforms>
<ns2:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<ns2:DigestValue>$6hpmccmjxQmAI143OhQfIWpkryw=</ns2:DigestValue>
</ns2:Reference>
</ns2:SignedInfo>
<ns2:SignatureValue>sv8n4h0rV4Xmbl+M+w+MLl7lVA8KFsoWRx5DqSKkwSie32jOFoJt0WvH6UWRQI</ns2:SignatureValue>
<ns2:KeyInfo>
<ns2:X509Data>
<ns2:X509IssuerName>CN=TestSignCert</ns2:X509IssuerName>
<ns2:X509SerialNumber>75496503122422458150193540449068096025</ns2:X509SerialNumber>
</ns2:X509Data>
</ns2:KeyInfo>
</ns2:Signature>
</ns3:Security>
</env:Header>
<env:Body ns1:Id="TheBody">
<ns1:aanleverRequest>
<ns1:berichtsoort>Omzetbelasting</ns1:berichtsoort>
<ns1:aanleverkenmerk>Happyflow</ns1:aanleverkenmerk>
<ns1:identiteitBelanghebbende>
<ns1:nummer/>
<ns1:type/>
</ns1:identiteitBelanghebbende>
<ns1:rolBelanghebbende>Intermediair</ns1:rolBelanghebbende>
<ns1:berichtInhoud>
<ns1:mimeType/>
<ns1:bestandsnaam/>
<ns1:inhoud/>
</ns1:berichtInhoud>
<ns1:autorisatieAdres>https://secure.inepd.nl/inloon</ns1:autorisatieAdres>
</ns1:aanleverRequest>
</env:Body>
</env:Envelope>
通过__getLastRequest查看XML
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://logius.nl/digipoort/koppelvlakservices/1.2/" xmlns:ns2="http://www.w3.org/2000/09/xmldsig#" xmlns:ns3="http://schemas.xmlsoap.org/soap/security/2000-12">
<env:Header>
<ns3:Security env:mustUnderstand="true">
<ns2:Signature>
<ns2:SignedInfo>
<ns2:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
<ns2:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
<ns2:Reference>
<ns2:Transforms>
<ns2:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
</ns2:Transforms>
<ns2:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<ns2:DigestValue>$6hpmccmjxQmAI143OhQfIWpkryw=</ns2:DigestValue>
</ns2:Reference>
</ns2:SignedInfo>
<ns2:SignatureValue>sv8n4h0rV4Xmbl+M+w+MLl7lVA8KFsoWRx5DqSKkwSie32jOFoJt0WvH6UWRQI</ns2:SignatureValue>
<ns2:KeyInfo>
<ns2:X509Data>
<ns2:X509IssuerName>CN=TestSignCert</ns2:X509IssuerName>
<ns2:X509SerialNumber>75496503122422458150193540449068096025</ns2:X509SerialNumber>
</ns2:X509Data>
</ns2:KeyInfo>
</ns2:Signature>
</ns3:Security>
</env:Header>
<env:Body>
<ns1:aanleverRequest>
<ns1:berichtsoort>Omzetbelasting</ns1:berichtsoort>
<ns1:aanleverkenmerk>Happyflow</ns1:aanleverkenmerk>
<ns1:identiteitBelanghebbende>
<ns1:nummer/>
<ns1:type/>
</ns1:identiteitBelanghebbende>
<ns1:rolBelanghebbende>Intermediair</ns1:rolBelanghebbende>
<ns1:berichtInhoud>
<ns1:mimeType/>
<ns1:bestandsnaam/>
<ns1:inhoud/>
</ns1:berichtInhoud>
<ns1:autorisatieAdres>https://secure.inepd.nl/inloon</ns1:autorisatieAdres>
</ns1:aanleverRequest>
</env:Body>
</env:Envelope>
2条答案
按热度按时间os8fio9y1#
我想出了为什么,这可能是一个有点奇怪的回答我自己的问题,但也许它可能会帮助别人在未来;在这种情况下,__getLastRequest()不是实际的最后一个请求,所以覆盖__doRequest是一个选项,但在这种情况下不要使用__getLastRequest!
rhfm7lfc2#
正如您所发现的,
__getLastRequest()
返回发送到__do_Request()
的请求,而不是通过网络发出的请求...您有两个选择:
a)覆盖__getLastRequest(除了__doRequest之外)
B)向__doRequest方法添加几行代码,以更新SoapClient的私有
__last_request
属性