debuss-a/mtomsoapclient

该类重写了 SoapClient::__doRequest() 方法以实现 PHP 的 MTOM 功能。它解码 XML 并将附件整合到 XML 响应中。

3.0.1 2023-02-15 21:08 UTC

This package is auto-updated.

Last update: 2024-09-16 00:19:34 UTC


README

Build Status Latest Stable Version Total Downloads License

一个小型 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)