2013-03-08 17 views
16

PHP kullanarak SOAP yöntemini çağırmaya çalışıyorum.XML gövdeli PHP kullanarak SOAP çağrısı oluşturma

<?xml version="1.0" encoding="UTF-8"?> 
    <SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://example.com/wsdl" xmlns:ns2="http://xml.apache.org/xml-soap" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <SOAP-ENV:Body> 
     <Echo> 
     <Acquirer> 
      <Id>MyId</Id> 
      <UserId>MyUserId</UserId> 
      <Password>MyPassword</Password> 
     </Acquirer> 
     </Echo> 
    </SOAP-ENV:Body> 
    </SOAP-ENV:Envelope> 
: Ben gibi görünmek istek istemek burada ne

<?xml version="1.0" encoding="UTF-8"?> 
    <SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://example.com/wsdl" xmlns:ns2="http://xml.apache.org/xml-soap" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <SOAP-ENV:Body> 
     <ns1:Echo> 
     <param0 xsi:type="ns2:Map"> 
      <item> 
      <key xsi:type="xsd:string">Acquirer</key> 
      <value xsi:type="ns2:Map"> 
       <item> 
       <key xsi:type="xsd:string">Id</key> 
       <value xsi:type="xsd:string">mcp</value> 
       </item> 
       <item> 
       <key xsi:type="xsd:string">UserId</key> 
       <value xsi:type="xsd:string">tst001</value> 
       </item> 
       <item> 
       <key xsi:type="xsd:string">Password</key> 
       <value xsi:type="xsd:string">test</value> 
       </item> 
      </value> 
      </item> 
     </param0> 
     </ns1:Echo> 
    </SOAP-ENV:Body> 
    </SOAP-ENV:Envelope> 

Ve bulunuyor: Burada

$data = array('Acquirer' => 
    array(
    'Id' => 'MyId', 
    'UserId' => 'MyUserId', 
    'Password' => 'MyPassword' 
)); 
$method = 'Echo'; 
$client = new SoapClient(NULL, 
      array('location' => 'https://example.com/ExampleWebServiceDL/services/ExampleHandler', 
      'uri' => 'http://example.com/wsdl', 'trace' => 1)); 
$result = $client->$method($data); 

oluşturduğu bir istek: Burada

elimdeki kod
+1

Bu, eksiksiz bir WSDL bilgisi olmadan çözülemez. PHP SoapClient, işlev argümanlarını doğru yerlere koymak için WSDL'yi aktif olarak kullanır ve kullanır. Yüklenen WSDL olmadan, çalışan bir şey oluşturmak neredeyse imkansızdır. – Sven

+0

@Sven - sorunumu tam olarak çözmese de bu çok yararlı. Cevap olarak gönderebilir misin? Başka kimseye cevap vermezse, en azından bunu bir şekilde yönlendirmeme yardımcı olduğumdan kabul edeceğim. – greggles

+0

Hayır, teşekkürler, daha iyi bir cevabınız var; – Sven

cevap

41

Bunu çözmenin birkaç yolu vardır. az hackiest ve neredeyse istediğini:

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://example.com/wsdl"> 
    <SOAP-ENV:Body> 
     <ns1:Echo> 
      <Acquirer> 
       <Id>MyId</Id> 
       <UserId>MyUserId</UserId> 
       <Password>MyPassword</Password> 
      </Acquirer> 
     </ns1:Echo> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

yöntem adını ad haricinde neredeyse tam olarak istediğiniz budur:

$client = new SoapClient(
    null, 
    array(
     'location' => 'https://example.com/ExampleWebServiceDL/services/ExampleHandler', 
     'uri' => 'http://example.com/wsdl', 
     'trace' => 1, 
     'use' => SOAP_LITERAL, 
    ) 
); 
$params = new \SoapVar("<Acquirer><Id>MyId</Id><UserId>MyUserId</UserId><Password>MyPassword</Password></Acquirer>", XSD_ANYXML); 
$result = $client->Echo($params); 

Bu size aşağıdaki XML alır. Bunun bir problem olup olmadığını bilmiyorum. Eğer öyleyse, daha da kesebilirsiniz. Sen elle XML dizesinde <Echo> etiketi koymak ve SoapClient böyle seçenekler dizisine 'style' => SOAP_DOCUMENT, ekleyerek yöntemi ayarlanmamış olabilir:

Bu aşağıdaki istek XML sonuçlanır
$client = new SoapClient(
    null, 
    array(
     'location' => 'https://example.com/ExampleWebServiceDL/services/ExampleHandler', 
     'uri' => 'http://example.com/wsdl', 
     'trace' => 1, 
     'use' => SOAP_LITERAL, 
     'style' => SOAP_DOCUMENT, 
    ) 
); 
$params = new \SoapVar("<Echo><Acquirer><Id>MyId</Id><UserId>MyUserId</UserId><Password>MyPassword</Password></Acquirer></Echo>", XSD_ANYXML); 
$result = $client->MethodNameIsIgnored($params); 

:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP-ENV:Body> 
     <Echo> 
      <Acquirer> 
       <Id>MyId</Id> 
       <UserId>MyUserId</UserId> 
       <Password>MyPassword</Password> 
      </Acquirer> 
     </Echo> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

Son olarak, SoapVar ve SoapParam nesneleriyle oynamak istiyorsanız, bu kılavuzda PHP el kitabında iyi bir başvuru bulabilirsiniz: http://www.php.net/manual/en/soapvar.soapvar.php#104065. Eğer bunu işe alırsan, lütfen bana haber ver, ben başarısız bir şekilde başarısız oldum.

8

Önce kapalı, sen Belge Değişmez tarzını kullanmak isteyen belirtmek zorunda: Sonra, bir SoapVar verileri dönüştürmek için gereken

$client = new SoapClient(NULL, array(
    'location' => 'https://example.com/path/to/service', 
    'uri' => 'http://example.com/wsdl', 
    'trace' => 1, 
    'use' => SOAP_LITERAL) 
); 

;

function soapify(array $data) 
{ 
     foreach ($data as &$value) { 
       if (is_array($value)) { 
         $value = soapify($value); 
       } 
     } 

     return new SoapVar($data, SOAP_ENC_OBJECT); 
} 

Ardından, bu verilerinizin üzerine fonksiyonu dönüşümü uygulanır:: ben basit dönüşümü işlevini yazdım

$method = 'Echo'; 

$result = $client->$method(new SoapParam($data, 'Data')); 
: Son olarak

$data = soapify(array(
    'Acquirer' => array(
     'Id' => 'MyId', 
     'UserId' => 'MyUserId', 
     'Password' => 'MyPassword', 
    ), 
)); 

, Data parametresini geçirerek hizmetlerini arayın

+0

Bu aslında "Veri" parametresiyle ilgili ilk kez gönderilen stackoverlow ifadesidir. –