Birden fazla ad alanı ile iletileri NuSOAP nasıl kullanılır

3 Cevap php

(Ben burada PHP4 bağlı değilim çünkü) bir mesajda fazla 1 ad kullanan NuSOAP kullanarak bir WebService erişmeye çalışıyorum. Bu mümkün mü?

Bir örnek istek mesajı aşağıdaki gibi olacaktır:

<soapenv:Envelope ...
  xmlns:ns1="http://domain.tld/namespace1"
  xmlns:ns2="http://domain.tld/namespace2">
  <soapenv:Header/>
  <soapenv:Body>
    <ns1:myOperation>
      <ns2:Person>
        <ns2:Firstname>..</ns2:Firstname>
        ..
      </ns2:Person>
      <ns1:Attribute>..</ns1:Attribute>
    </ns1:myOperation>
  </soapenv:Body>
</soapenv:Envelope>

Ben aşağıdaki çalıştı:

$client = new nusoap_client("my.wsdl", true);
$params = array(
  'Person' => array(
    'FirstName'  => 'Thomas',
    ..
   ),
   'Attribute' => 'foo'
 );

 $result = $client->call('myOperation', $params, '', 'soapAction');

umutla NuSOAP doğru ad alanları ve düğümleri bu isimleri maç çalışacaktı. Sonra elemanlarını ve bunların ad oluşturmak için () soapval kullanmaya çalıştı - ama ben bir operasyon çağrısı, NuSOAP aşağıdaki isteği oluşturur:

<SOAP-ENV:Envelope ...>
  <SOAP-ENV:Body>
    <queryCCApplicationDataRequest xmlns="http://domain.tld/namespace1"/>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Yani bir şey "eşleştirme" aşamasında yanlış gider.

3 Cevap

Eşleşen etrafında denedikten sonra, ben iki olası çözüm bulundu:

1) Don't use the WSDL to create the nusoap_client and soapval() to create the message This has the disadvantage that the message contains a lot of overhead (the namespace is defined in each element). Not so fine.

2) yerine parametrelerin eşleşen güvenmek, xml cevabınızı inşa ve ilk öğe önekler için tüm tanımını koymak - örneğin

$params = "<ns1:myOperation xmlns:ns1="..." xmlns:ns2="...">
      <ns2:Person>
        <ns2:Firstname>..</ns2:Firstname>
        ..
      </ns2:Person>
      <ns1:Attribute>..</ns1:Attribute>
    </ns1:myOperation>";

Hala çok güzel bir çözüm, ama o :-) çalışıyor

Irwin yazı üzerine inşa, ben elle xml oluşturulan ve gerisini NuSOAP vardı. Benim host php sabun uzantısı yok, bu yüzden NuSOAP ile gitmek zorunda kaldı, ve web hizmeti I (örneğin burada benim örnekte kullanıcı adı ve şifre) her etiketi üzerinde gerekli ad tüketmeye çalışıyorum.

require_once('lib/nusoap.php');

$client = new nusoap_client('https://service.somesite.com/ClientService.asmx');
$client->soap_defencoding = 'utf-8';
$client->useHTTPPersistentConnection(); // Uses http 1.1 instead of 1.0
$soapaction = "https://service.somesite.com/GetFoods";

$request_xml = '<?xml version="1.0" encoding="utf-8" ?>
<env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
  <env:Body>
    <n1:GetFoods xmlns:n1="https://service.somesite.com">
      <n1:username>banjer</n1:username>
      <n1:password>theleftorium</n1:password>
    </n1:GetFoods>
  </env:Body>
</env:Envelope>
';

$response = $client->send($request_xml, $soapaction, ''); 

echo '<h2>Request</h2><pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>';
echo '<h2>Response</h2><pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>';
echo '<h2>Debug</h2><pre>' . htmlspecialchars($client->getDebug(), ENT_QUOTES) . '</pre>';

Sonra dedim ki bir hata vardı:

Notice: Undefined property: nusoap_client::$operation in ./lib/nusoap.php  on line 7674

Yani tembel yol gitti ve nusoap.php içine gitti ve mutlu doğrultusunda 7674 önce bu kodu ekledi:

    if(empty($this->operation)) {
        $this->operation = "";
    }

Başka bir bypass Bu konu :: çağrısı () işlevi nusoap_client bir değişiklik olacaktır. Nusoap.php içinde (sürüm 1.123 olarak 7359) bu hat için Sonraki:

$nsPrefix = $this->wsdl->getPrefixFromNamespace($namespace);

Ben bu yenisini daha ekledi:

$nsPrefix = $this->wsdl->getPrefixFromNamespace("other_ns_name");

Ve işe yaradı! Ben sadece bir proje için bu kütüphaneyi gerekli beri bana bu kesmek kodlamalısınız için, Tamam oldu. Aksi takdirde, ben daha kazmak ve bir ad parametre için dizi yerine dize kabul etmek işlevini değiştirmek istiyorsunuz.