Autor Zpráva
quatzael
Profil
Když budu mít v proměnný již VYGENEROVANÝ SOAP request coby string, jak je prosím možné ho přímo odeslat? Nebo jak s tím nějak dál pracovat, aby šel odeslat?

$request = '<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:web="http://ws.wsdomain.com">
   <soap:Header/>
   <soap:Body>
      <web:mainFunction>
         <login>
            <loginData>
               <name>Freak</name>
               <password>qwerty</password>
            </loginData>
         </login>
         <xmlData>
         <![CDATA[
         <data>
          <id>123456</id>
          <value>69</value>
         </data>
        ]]>
       </xmlData>
      </web:mainFunction>
   </soap:Body>
</soap:Envelope>';

Co mám udělat, abych tohle odeslal v PHPku úplně stejně jako to odesílám v SoapUI?
Předem díky moc za všechny odpovědi.
blaaablaaa
Profil
quatzael:
Proc to chces odeslat primo a nevyuzijes nejakou knihovnu?
Jinak odeslat to muzes napr. pomoci curl.
quatzael
Profil
blaaablaaa:
Dobrá otázka.. Protože mi to přes SoapClient prostě nějak nefunguje..
Rozchodil jsem to přes SoapUI. Tam to běží.
Tak mě prostě napadlo, že bych to posílal přímo. Asi nejjednodušší řešení momentálně..

Hází mi to chybu: SOAP-ERROR: Encoding: object has no 'xmlData' property
Zkouším všechny varianty jak to tam zadat.
Kód vypadá takto:
$ws_result = $soapClient->Funkce($login,$xml,true); 
Login to bere, xml ne. Má se to tam vkládat jako objekt tzn.:
$xml->xmlData = $xml_content;
Taky přesně nevím co by mělo být v tom $xml_content, jestli jen čistě string, tzn. nějak takto:
$xml_content = '<data>
<id>123456</id>
<value>69</value>
</data>';

Nebo včetně <![CDATA[ (to ale moc logiku nemá), nebo taky s <?xml version="1.0" encoding="WINDOWS-1250"?> na začátku. Zkoušel jsem snad všechny varianty včetně simplexml_load_string($xml_content) nebo to celý dát nějak do SoapVar.

Prostě nic nefunguje.. V dokumentaci je uvedeno, že pro správné fungování je potřeba zakázat CHUNKED transfer-encoding.
Jenže to nevím jak se dělá.. (navíc ani není jistý, jestli to je ten problém, který chybu způsobuje.
Každopádně jsem zkoušel na to založit vlákno: Jak zakázat CHUNKED encoding?, jenže na to mi tady nikdo neodpověděl.
Pátral jsem na netu, žádnej pořádnej návod jsem na to nenašel. Jediný co jsem zjistil, že se to dělá nějak tím, že se v hlavičce nastaví délka requestu. Na to jsem zase založil vlákno: Jak poslat header v SOAP requestu?, ale taky bez odpovědi.

Už jsem naprosto zoufalej..

A jak se to teda prosímtě dá poslat přes to cURL? Já fakt nevím, jsem totální lama na tohle..
quatzael
Profil
Tak tady je řešení:
V dokumentaci byly položky login a xmlData popsány jako dva oddělené parametry, takže jsem to zadával takto:
$ws_result = $soapClient->mainFunction($login,$xml);

Ale ve skutečnosti se měl zadat jeden parametr. Zjednodušeně:

$xml = '<![CDATA ... xml contents ...  ]]>';
class loginData{var $name= 'Freak'; var $password= 'qwerty';}
class login {var $loginData;} 
class input {var $login; var $xmlData;}
$loginData= new loginData;
$login = new login;
$input = new input;
$login->loginData= $loginData;
$input->login = $login;
$input->xmlData = $xml; 
$ws_result = $soapClient->mainFunction($input);

Ale problém zůstává to chunkování. Nejspíš to SoapClient neumí. Nevím. Jde o to, že se musí nastavit header v odesílaném requestu a v něm přesně zadat délku requestu v položce content-length

To se mi podařilo vyřešit jedině pomocí cURL. Tady jsem našel řešení: stackoverflow.com/questions/7120586/soap-request-in-php-with-curl

Trochu jsem to poupravil a funguje to!!
End of story..
Kubo2
Profil
quatzael:
class loginData{var $name= 'Freak'; var $password= 'qwerty';}
class login {var $loginData;}
class input {var $login; var $xmlData;}

Nestačila by ti jednoducho stdClass?
quatzael
Profil
Normálně asi jo, prve jsem zkoušel všechny možnosti. Včetně toho std. A nic nefungovalo..
Některý webový služby vyžadují přímo std, některý se zmiňují jen o objektech obecně a někde se musí zase pro změnu data vkládat v poli.

Mě by spíš zajímalo jak z wsdl souboru vyčtu jestli tam mám dávat pole nebo objekt.. Nemá to náhodou nějakou souvislost s rozdílem mezi complextype a sequence? Nevíte náhodou někdo?

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: