Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno SoapClient odmieta spracovať WSDL

Potrebujem vytvoriť komunikačný script pomocou SOAP požiadavky na WSDL. Našiel som stránku, kde sa uvádza príklad použitia. Podľa toho som si spravil vlastný script. Script havaruje pri vytvorení inštancie SoapClient. Vedel by mi niekto poradiť, kde mám hľadať problém?

Stránka:
http://php.vrana.cz/webove-sluzby-v-php-xml-rpc-a- soap.php

Script:

<?php
define("INT_ID", "xxx");
define("INT_KEY", "xxx");
define("TEL_NUMBER", "xxx");

$signature = xxx;

$limit = 10;
$soap = new SoapClient('http://as.lab.sk/sms/ioService?WSDL');

$Search = array(
    "integrationId" => INT_ID,
    "signature" => $signature,
    "from" => TEL_NUMBER,
);
$SearchResponse = $soap->Search(array("Request" => $Search));

echo "<pre>";
print_r($SearchResponse);
echo "</pre>";
?>

Chybová hláška:

Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'ioService' : Extra content at the end of the document in D:\xampp\htdocs\www\test\index0.php:9
Stack trace:
#0 D:\xampp\htdocs\www\test\index0.php(9): SoapClient->SoapClient('as.lab.s...')
#1 {main} thrown in D:\xampp\htdocs\www\test\index0.php on line 9

Znakmi "xxx" som zakryl citlivé časti kódu.

Je mi jasné, že $soap->Search je nezmysel, ale vykonávanie kódu sa mi zastaví v riadku 9, takže to teraz neriešim.

Předmět Autor Datum
Stiahni si lokálne ten WSDL súbor aj s ďalšími súbormi, na ktoré odkazuje. Uprav v ňom odkazy tak, a…
los 12.08.2011 12:44
los
Čiže by som si mal stiahnuť tie dva súbory na začiatku WSDL v tagu schema? Ak sa teda jedná o bug (…
msx. 12.08.2011 13:00
msx.
Takže keď som to dal lokálne, prešlo to až do riadku 16 (spomínaný Search). Mám si to ponechať lokál…
msx. 12.08.2011 13:05
msx.
Lokálne ti to bude fungovať (hodnotu soap:address location necháš bez zmeny). Interfejsy na webové s…
los 12.08.2011 14:00
los
Takže lokálne mi to funguje, keď to hodím na hosting a tie XML budem mať na hostingu aj stiahnuté, p… poslední
msx. 12.08.2011 16:41
msx.

Stiahni si lokálne ten WSDL súbor aj s ďalšími súbormi, na ktoré odkazuje. Uprav v ňom odkazy tak, aby sa používali lokálne súbory. Potom vyskúšaj vytvoriť SOAP klienta pomocou tých lokálnych súborov.

Ak to pôjde, tak chyba vzniká kvôli bugu v PHP (môže byť spôsobený napr. aj HTTP hlavičkami - napr. nevidím, že by tá odpoveď obsahovala Content-Length hlavičku).

Čiže by som si mal stiahnuť tie dva súbory na začiatku WSDL v tagu schema?

Ak sa teda jedná o bug (toto musí reálne fungovať, keďže to využíva plno zákazníkov), dá sa na to stiahnuť nejaká knižnica, kde je toto ošetrené? Prípadne ako postupovať, aby som ten bug "opravil"?

Takže keď som to dal lokálne, prešlo to až do riadku 16 (spomínaný Search). Mám si to ponechať lokálne a bude to fungovať?

Doplnené: Alebo ešte otázka: Môže to poskytovateľ zmeniť a nastane problém. Nebolo by lepšie informovať poskytovateľa, nech spraví nápravu? A ak áno, čo by mal presne spraviť?

Lokálne ti to bude fungovať (hodnotu soap:address location necháš bez zmeny). Interfejsy na webové služby sa nemenia často. Ak áno, tak sa väčšinou len dopĺňajú. V opačnom prípade by to bola tak či tak breaking change, taže by klient prestal fungovať, aj keby si si SoapClienta inicializoval z aktuálneho WSDL.

Tiež v kompilovaných nedynamických jazykoch sa z WSDL generujú triedy a po breaking change zmene WSDL je treba prekompilovať celý program.

Poskytovateľa informovať môžeš. Mal by vedieť zistiť sám, čo treba opraviť, ale nepredpokladám, že by to opravili (keďže jednoduchý workaround existuje).

Ak si chceš presne vyskúšať, čo treba zmeniť, tak si vytvor server, kde budeš posielať rovnakú odpoveď a postupne budeš upravovať hlavičky. Keďže ti to ide lokálne, tak problém bude len niekde v HTTP hlavičkách. Tipujem, že problémom bude chýbajúci Content-Length, ale môžu to spôsobovať aj iné hlavičky.

Takže lokálne mi to funguje, keď to hodím na hosting a tie XML budem mať na hostingu aj stiahnuté, predpokladám, že to bude fungovať tiež. Ak sa mýlim, prosím, oprav ma. A tým teda diskusiu uzatváram, ďakujem za pomoc. Celú dobu som hľadal, kde robím chybu ja a chyba bola v PHP.

Zpět do poradny Odpovědět na původní otázku Nahoru