2009-04-01 10 views
6

Sto tentando di accedere a un servizio Web utilizzando nuSOAP (perché sono legato a PHP4 qui) che utilizza più di uno spazio dei nomi in un messaggio. È possibile?Come utilizzare nuSOAP per i messaggi con più spazi dei nomi

Un esempio messaggio di richiesta sarebbe simile a questa:

<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> 

ho cercato di seguito:

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

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

nella speranza che nusoap avrebbe cercato di abbinare questi nomi per gli spazi dei nomi e nodi corretti. Poi ho cercato di usare soapval() per generare gli elementi e il loro spazio dei nomi - ma se chiamo un intervento, NuSOAP crea la seguente richiesta:

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

Quindi, qualcosa va storto durante la fase di "matching".

risposta

5

Dopo aver provato in giro con l'abbinamento, ho trovato due possibili soluzioni:

1) Non utilizzare il WSDL per creare il nusoap_client e soapval() per creare il messaggio Questo ha lo svantaggio che il messaggio contiene un sacco di overhead (lo spazio dei nomi è definito in ogni elemento). Non così bene.

2) Invece di fare affidamento sulla corrispondenza dei parametri, costruire la risposta in xml e inserire tutte le definizioni per i prefissi nel primo elemento - ad es.

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

Ancora una bella soluzione, ma funziona :-)

+0

Ho appena provato la tua soluzione e funziona .... grazie amico. –

0

Sì, ho avuto questo stesso problema (trovato il vostro q tramite google!) E ho incontrato questo: http://www.heidisoft.com/blog/using-nusoap-consume-net-web-service-10-min Qui, il dev crea il corpo xml del messaggio in coe e quindi usa nusoap per inviare.

+0

Hmm, sembra che il collegamento al momento non funzioni. Da quello che dici, sembra che abbiano seguito un approccio simile (creando l'xml "manualmente"), giusto? – wilth

4

Sulla base del post di Irwin, ho creato manualmente l'xml e facevo nusoap per il resto. Il mio webhost non ha l'estensione php soap, quindi ho dovuto andare con nusoap, e il servizio web che sto cercando di consumare ha richiesto gli spazi dei nomi su ogni tag (ad esempio su username e password nel mio esempio qui).

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>'; 

poi ho avuto un errore che ha detto:

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

Così sono andato il percorso pigro e andò in nusoap.php e ha aggiunto questo codice prima linea 7674 per renderlo felice:

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

Dopo aver setacciato internet per giorni questa è l'unica cosa che mi ha aiutato a capirlo. Grazie! Non ho ricevuto questo errore, ma ho dovuto impostare $ client-> endpoint = ''; – Cypher909

1

Un altro bypass questo problema sarebbe una modifica alla funzione nusoap_client :: call(). Accanto alla questa linea (7359 nella versione 1.123) in nusoap.php:

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

ho aggiunto questo:

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

e ha funzionato! Dal momento che avevo solo bisogno di questa libreria per un progetto, per me era corretto codificare questo trucco. Altrimenti, vorrei scavare di più e modificare la funzione per accettare array anziché string per un parametro namespace.

Problemi correlati