NuSOAP v PHP a sežrání SOAPu C# aplikací
(Mimochodem, jak byste v tomto kontextu přeložili "consuming" vy?)
Tak se stalo, že po půl roce zase něco napíšu a opět to bude něco spíše pro vlastní zapamatování, ale snad z toho někdy bude těžit i někdo jiný.
Pracuji na jednom projektu sestávajícího z webu v PHP napojeného na MySQL databázi a klientské aplikace v C# (aplikaci by bylo možné udělat i online, ale protože se v PHP vyznám tak z poloviny dobře jako v C# (a ASP.NET/Silverlight nepřipadá tady v úvahu), tak jsem se rozhodl polovinu ušetřeného času raději věnovat řešení problémům s propojením MySQL se C# přes SOAP:)) )
A že těch problémů bylo (a asi ještě bude). Pro generování WSDL souboru jsem se rozhodl použít PHP knihovnu NuSOAP, což proběhlo ještě relativně v pohodě a dokonce to fungovalo. (Maličké how-to např. zde: http://www.scottnichol.com/nusoapprogwsdl.htm, další pak na Googlu).
Trocha legrace začala při pokusech o vytvoření reference na službu ve Visual Studiu 2010, díky této stránce jsem se dozvěděl, že to nejde přes "Service reference", ale musí se do projektu přidat zastaralá "Web reference".
V této fázi se mi dokonce podařilo vytáhnout ze C# pár dat z databáze přes mou službu, jakou jsem měl radost! O půl hodiny později se bohužel někde něco pokazilo a už mi nešlo vůbec nic (chyby typu "špatně formátované XML", nebo že je poškozená reference).
Po několika hodinách hledání, upravování a vyzkoušení několika dalších postupů (vyzkoušel jsem např. vestavěnou podporu SOAP v PHP5 a samostatný .wsdl soubor a pár dalších) jsem omylem kde hluboko v internetu našel sérii článků, která mě zachránila, díky!! (autor používá způsob, se kterým jsem do toho šel úplně nejdřív) - http://www.hirdweb.com/tag/nusoap/
Poté stačilo jen vyřešit problémy s kódováním (buďto se špatně zobrazovaly znaky v desktop aplikaci nebo se špatně uložily do databáze):
- Na konci kódu SOAP serveru zavolat encode na odesílaná data:
$server->service(utf8_encode($HTTP_RAW_POST_DATA));
- Na řádku 5475 souboru nusoap.php bylo napevno nastavené kódování, asi to tvůrcům uniklo, takže jsem ho musel přepsat na UTF-8
function serialize($debug = 0)
{
$xml = '<?xml version="1.0" encoding="UTF-8"?>';
To je asi vše. Mám v plánu napsat rozsáhlejší, detailnější článek až vyřeším všechny problémy.