debuss-a / mtomsoapclient
该类重写了 SoapClient::__doRequest() 方法以实现 PHP 的 MTOM 功能。它解码 XML 并将附件整合到 XML 响应中。
3.0.1
2023-02-15 21:08 UTC
Requires
- php: ^7.3||^8.0
- ext-dom: *
- ext-soap: *
Requires (Dev)
- ext-libxml: *
- ext-simplexml: *
- pestphp/pest: ^1.22
README
一个小型 PHP Soap 类,用于处理 MTOM 技术,将二进制文件作为 base64 字符串获取。
该类重写了 SoapClient::__doRequest() 方法以实现 PHP 的 MTOM 功能。
它解码 XML 并将附件整合到 XML 响应中。
它替换了
<xop:Include href="cid:d08bab58-dfea-43f0-8520-477d4c5e0677-103@cxf.apache.org" xmlns:xop="http://www.w3.org/2004/08/xop/include"/>
附件中包含的二元代码
Content-ID: <d08bab58-dfea-43f0-8520-477d4c5e0677-103@cxf.apache.org>
个人笔记
该类并不完美,也非特别优化,但适用于大多数情况,你可以根据需要修改它以使其更好。
祝您享受!
安装
通过 composer
$ composer require debuss-a/mtomsoapclient
示例
与正常 Soap 调用相同使用它
$client = new MTOMSoapClient($webservice, array( 'trace' => true, 'exceptions' => true, 'soap_version' => SOAP_1_1, 'encoding' => 'utf-8' )); $result = $client->__call( $method, $parameters ); if (!$result instanceof stdClass) { throw new Exception('Soap call response is not a valid stdClass instance.'); } var_dump($result->path->to->my->data);
解释
它将把这个答案(正常 Soap 响应,MTOM 未经 Soap 解析)
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <ns2:generateLabelResponse xmlns:ns2="http://sls.ws.webservice.fr"> <return> <messages> <id>0</id> <messageContent>La requete a ete traitee avec succes</messageContent> <type>INFOS</type> </messages> <labelResponse> <label> <xop:Include href="cid:983c41d7-d699-4373-b8da-4815099ef250-3880@cxf.apache.org" xmlns:xop="http://www.w3.org/2004/08/xop/include"/> </label> <parcelNumber>6A11353659111</parcelNumber> </labelResponse> </return> </ns2:generateLabelResponse> </soap:Body> </soap:Envelope>
转换为这个(MTOMSoap 响应,标签被替换为它们的 base64 值)
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <ns2:generateLabelResponse xmlns:ns2="http://sls.ws.webservice.fr"> <return> <messages> <id>0</id> <messageContent>La requete a ete traitee avec succes</messageContent> <type>INFOS</type> </messages> <labelResponse> <label>EENUfn5DRCx+Q0NefkNUfg0KXlhBDQpeUF[... ZPL code shortened for the sake of this Readme.md ...]</label> <parcelNumber>6A12097564594</parcelNumber> </labelResponse> </return> </ns2:generateLabelResponse> </soap:Body> </soap:Envelope>
一个 var_dump() 的 _$result = $client->__call($url, $params) 将看起来像这样(注意: SoapClient 自动进行 base64_decode())
object(stdClass)[2] public 'return' => object(stdClass)[3] public 'messages' => object(stdClass)[4] public 'id' => string '0' (length=1) public 'messageContent' => string 'La requete a ete traitee avec succes' (length=41) public 'type' => string 'INFOS' (length=5) public 'labelResponse' => object(stdClass)[5] public 'label' => string '�CT~~CD,~CC^~CT~ ^XA ^PW799 ^FO0,0^GFA,11264,11264,00088,:Z64: eJzt2UFv2zYUAGByKqIW8MKrD4bUnnbVsEsGuGH+wf[... ZPL code shortened for the sake of this Readme.md ...]' (length=5856) public 'parcelNumber' => string '6A12097564600' (length=13)