Çok parçalı mesajlar anlar PHP SOAP istemci?

4 Cevap php

Böyle bir beastie var mı? Basit SOAP client PHP ile birlikte çok parçalı mesajlar anlamıyor. Şimdiden teşekkürler.

4 Cevap

Doğal PHP SoapClient class does not support multipart messages (and is strongly limited in all WS-* matters) and I also I think that neither the PHP written libraries NuSOAP, ne Zend_Soap SOAP mesajlarının bu tür başa çıkabilirim.

Ben iki çözüm düşünebilirsiniz:

  • SoapClient sınıfını genişletmek ve daha sonra kapris ayrıştırmak gerçek cevap dize yakalayabilmeleri için SoapClient::__doRequest() yöntemi üzerine.

    class MySoapClient extends SoapClient
    {
        public function __doRequest($request, $location, $action, $version, $one_way = 0)
        {
            $response = parent::__doRequest($request, $location, $action, $version, $one_way);
            // parse $response, extract the multipart messages and so on
        }
    }
    

    Ancak bir cami - Bu biraz zor olsa da olabilir.

  • PHP için daha sofistike bir SOAP istemci kitaplığı kullanın. İlk ve tek aklıma geliyor olması WSO2 WSF/PHP hangi yüklemek zorunda pahasına SOAP MTOM, WS-Adresleme, WS-Security, WS-SECURITYPOLICY, WS-Secure Konuşma ve WS-ReliableMessaging özellikleri Bir doğal PHP uzantısı.

S. Gehrig ikinci fikri kullanarak burada sadece iyi çalıştı.

In most cases, bir MIME iletisinde içine paketlenmiş tek bir mesajım var. Bu durumlarda bir "SoapFault exception: [Client] looks like we got no XML document" istisnası atılır. İşte aşağıdaki sınıf sadece iyi yapmalıdır:

class MySoapClient extends SoapClient
{
    public function __doRequest($request, $location, $action, $version, $one_way = 0)
    {
        $response = parent::__doRequest($request, $location, $action, $version, $one_way);
        // strip away everything but the xml.
        $response = preg_replace('#^.*(<\?xml.*>)[^>]*$#s', '$1', $response);
        return $response;
    }
}

PHP belgelerine rafinskipg tavsiye izleyin:

MTOM için destek proje için bu kodu addign:

<?php 
class MySoapClient extends SoapClient
{
    public function __doRequest($request, $location, $action, $version, $one_way = 0)
    {
        $response = parent::__doRequest($request, $location, $action, $version, $one_way);
        // parse $response, extract the multipart messages and so on

        //this part removes stuff
        $start=strpos($response,'<?xml');
        $end=strrpos($response,'>');    
        $response_string=substr($response,$start,$end-$start+1);
        return($response_string);
    }
}

?>

Sonra bunu yapabilirsiniz

<?php
  new MySoapClient($wsdl_url);
?>

Sadece önceki önerilen adımlara daha fazla ışık eklemek için. Siz aşağıdaki biçimde yanıt almak gerekir

    --uuid:eca72cdf-4e96-4ba9-xxxxxxxxxx+id=108
Content-ID: <http://tempuri.org/0>
Content-Transfer-Encoding: 8bit
Content-Type: application/xop+xml;charset=utf-8;type="text/xml"

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body> content goes here </s:Body></s:Envelope>
--uuid:c19585dd-6a5a-4c08-xxxxxxxxx+id=108--

Sadece (regex yani dize işlevlerini kullanarak bu büyük değilim) aşağıdaki kodu kullanabilirsiniz

 public function __doRequest($request, $location, $action, $version, $one_way = 0)
{
    $response = parent::__doRequest($request, $location, $action, $version, $one_way);
    // strip away everything but the xml.
    $response = stristr(stristr($response, "<s:"), "</s:Envelope>", true) . "</s:Envelope>";
return $response;
}