#1 před 2 lety

paranoiq
Člen
Registrovaný: 14. 11. 2006
Příspěvky: 350

SOAP – serializace pole

používám nativní extenzi PHP SOAP, PHP 5.2.6

prvek, který potřebuji serializovat je ve schématu služby definován s parametrem maxOccurs=„unbounded“, může se tedy vyskytovat několikrát za sebou. toho se mi bohužel nedaří docílit

v ukázce jde o element „ccc“

očekávaný výstup je takový:

<aaa>
  <bbb>bbb</bbb>
  <ccc>
    <a>1</a>
    <b>2</b>
  </ccc>
  <ccc>
    <a>3</a>
    <b>4</b>
  </ccc>
  <ddd>ddd</ddd>
</aaa>

zjednodušená část struktury, kterou serializuji je zde:

'aaa' => new SoapVar(array(
    'bbb' => 'bbb',
    'ccc' => array(
        new SoapVar(array('a' => 1, 'b' => 2), SOAP_ENC_OBJECT),
        new SoapVar(array('a' => 3, 'b' => 4), SOAP_ENC_OBJECT),
    ),
    'ddd' => 'ddd',
), SOAP_ENC_OBJECT);

(ve skutečnosti jde krom pole ccc o objekty, ale to není podstatné. na výsledku to nic nemění)

skutečný výstup je takový:

<aaa>
  <bbb>bbb</bbb>
  <ccc>
    <SOAP-ENC:Struct>
      <a>1</a>
      <b>2</b>
    </SOAP-ENC:Struct>
    <SOAP-ENC:Struct>
      <a>3</a>
      <b>4</b>
    </SOAP-ENC:Struct>
  </ccc>
  <ddd>ddd</ddd>
</aaa>

mohl by někdo poradit, jak kýženého výsledku dosáhnout? (případně i v NuSOAP nebo PEAR/SOAP)

nastavení SOAP_SINGLE_ELEMENT_ARRAYS a SOAP_USE_XSI_ARRAY_TYPE na tohle nemají vliv.

pole ccc nelze definovat jako SOAP_ENC_OBJECT – má číselné indexy. při jeho definici jako SOAP_ENC_ARRAY je výsledek stejný. vyzkoušel jsem všechny možnosti SOAP_ENC_.. včetně nedokumentováných.

jak by měla serializovaná struktura či parametry vypadat, aby se požadavek serializoval správně?

Editoval paranoiq (19. 8. 2009 16:26)

 

#2 před 2 lety

phx
Moderator
Registrovaný: 17. 4. 2008
Příspěvky: 878

Re: SOAP – serializace pole

Napada me prasarna: str_replace.

  1. ‚<ccc>‘ → ''
  2. ‚</ccc>‘ → ''
  3. <SOAP-ENC:Struct> → ‚<ccc>‘
  4. </SOAP-ENC:Struct> → ‚</ccc>‘

Jinak nevim. Nikdy jsem to neresil.

Dalsi moznost je si to XML udelat rucne.

 

#3 před 2 lety

paranoiq
Člen
Registrovaný: 14. 11. 2006
Příspěvky: 350

Re: SOAP – serializace pole

SoapClientu nejde podstrčit změněný request k odeslání. serializuje se to samo v okamžiku kdy je odesílán požadavek.

pokud bych řešil vlastní serializaci, musel bych řešit i vlastní deserializaci odpovědi – a to už nejsme u SOAP rozšíření, to už je pěkně po staru. tohle, nebo nalezení použitelnější SOAP knihovny je až další iterace. teď hledám řešení tohoto problému. nechce se mi věřit, že by to neumělo takto obyčejnou konstrukci. stále doufám, že chyba je u mě :]

Editoval paranoiq (19. 8. 2009 18:05)

 

#4 před 2 lety

paranoiq
Člen
Registrovaný: 14. 11. 2006
Příspěvky: 350

Re: SOAP – serializace pole

zatím problém řeším vlastní serializací a odesláním dotazu. odpověď není nutné příliš pitvat

ale pokud někdo víte jak na to, každou radu vítám

 

Zápatí