Böyle bir beastie var mı? Basit SOAP client PHP ile birlikte çok parçalı mesajlar anlamıyor. Şimdiden teşekkürler.
Böyle bir beastie var mı? Basit SOAP client PHP ile birlikte çok parçalı mesajlar anlamıyor. Şimdiden teşekkürler.
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;
}