Jak wysłać array do zaimportowanej funkcji WSDL(SOAP) w delphi

0

Witam,

Zaimportowałem sobie WSDL i mam funkcję:

function  call(const session: string; const function_: string; const arguments: Variant): Variant; stdcall;

Teraz pobieranie informacji np. atrybutów produktu w PHP

array call(string $session_id, "product.attributes", array($id))

Nie mogę sobie poradzić w delphi by wysłać w arguments poprawnie to id produktu do którego się chcę odwołać..

call(key,'product.attributes',72);

nie działa wywala błąd... 72 to id produktu.

0

może byś zaczął od tego JAKI BŁĄD!!!

0
abrakadaber napisał(a):

może byś zaczął od tego JAKI BŁĄD!!!

Jasne ;-)
Project xxx raised exception class ERemotableException with message 'Unknown error'

0

oczywiście nie dałeś definicji tej funkcji, jak ona wygląda w "oryginale".
Spróbuj

call(key,'product.attributes',VarArrayOf([72]));
0
abrakadaber napisał(a):

oczywiście nie dałeś definicji tej funkcji, jak ona wygląda w "oryginale".
Spróbuj

call(key,'product.attributes',VarArrayOf([72]));

Niestety to samo ;-) już tak próbowałem..

0
call(key,'product.attributes', VarArrayOf([72])[0]);

powinno pomoc,
schody zaczynaja sie, gdy jako argumenty trzeba przekazac np cos takiego.. -> array($id, $translations = false)

a funkcja call moze wygladac tak:

function  call(const session: string; const function_: string; const arguments: Variant): Variant; stdcall;

wtedy przydaloby sie przekazac cos w stylu: VarArrayOf([72, true]));

ale wtedy serwer tego nie przyjmie... zastanawiam sie czy to wina serwisow, ze gdy podaje im sie obiekt variant, ktory jest jednoczesnie tablica variantow to serwer tego nie potrafi odczytac, a jedynie potrafi pojedyncze argumenty przyjac... ktos sie spotkal z takim problemem - akurat mam podobny problem teraz...

0

No właśnie bo powinna być przekazana nazwa zmiennej, a on robi wtedy:

<arguments xsi:type="xsd:integer">72</arguments>

Zamiast arguments powinno być nazwa zmiennej np.

<id xsi:type="xsd:integer">72</id>

dodanie znaczników <code class="xml"> i usunięcie cytowania całego poprzedniego posta - fp

0

Widze, ze pomyslow brak jak przeslac tablice argumentow przez SOAP...

0

po pierwsze nie podałeś jak opisana jest funkcja w dokumentacji. To co wysyła PHP nic nie mówi o tym czego funkcja oczekuje. Są znane problemy z importem WSDL w delphi i trzeba je czasem samemu poprawić. Pewnie nie możesz podać adresu samego WSDLa

0

Podepnę się pod temat bo mam podobny problem.
Z tego co widzę kolega robi chyba coś podobnego i u mnie działa zarówno :

variant1 := apiShoper.call(s_session_id, 'producer.info', VarArrayOf([40])[0]);
 

jak i

variant1 := apiShoper.call(s_session_id, 'producer.info', '40');
 

Lub też

variant1 := apiShoper.call(s_session_id, 'producer.info', 40);
 

W variant1 po przeiterowaniu w pętli dostaję poprawne informacje o producencie.
Jednakże nie potrafię zmusić do działania funkcji opisanej tu:

http://www.shoper.pl/help/api/method/name/producer.create/m/producer

Jakbym nie próbował to rzucany jest wyjątek Invalid data container czyli,że niby dane nie są w formie tablicy.
Myślałem, że załatwię sprawę variantami ale niestety nic z tego :

var:
temp, temp2, temp3,temp4: Variant;
{...}  
temp2 := VarArrayCreate([0, 2], varVariant);
  temp3 := VarArrayCreate([0, 1], varOleStr);
  temp4 := VarArrayCreate([0, 2], varVariant);

  varArrayPut(temp4, 'gfx', [0]);
  varArrayPut(temp3, 'file', [0]);
  varArrayPut(temp3, '', [1]);
  varArrayPut(temp4, temp3, [1]);
  varArrayPut(temp3, 'content' , [0]);
  varArrayPut(temp3, '', [1]);
  varArrayPut(temp4, temp3, [2]);

  varArrayPut(temp3, 'name', [0]);
  varArrayPut(temp3, 'prod2', [1]);
  varArrayPut(temp2, temp3, [1]);

  varArrayPut(temp3, 'web', [0]);
  varArrayPut(temp3, 'http://www.google.pl', [1]);
  varArrayPut(temp2, temp3, [2]);
variant1 := apiShoper.call(s_session_id, 'producer.create', temp2);
 

Jakieś pomysły ? Już drugi dzień nad tym siedzę i nic.

1 użytkowników online, w tym zalogowanych: 0, gości: 1