Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Algorytmy, klasy, funkcje _ [kalsa] SOAP - tworzenie requesta

Napisany przez: czesio159 7.10.2014, 12:54:41

Witam,
mam problem ze skonstruowaniem wywołania funkcji SOAP.
Mam przykładowego XMLa, kiedy wywołuję go z programu SoapUI, dostaję prawidłową odpowiedź, więc XML wygląda na dobry.
Klienta SOAP na poziomie PHP mam też dobrze skonfigurowanrgo - inne funkcje dają dobre odpowiedzi.
Podejrzewam, że problem pojawia się na próbie przełożenia XML do parametru wywołania funkcji.
Zawartość XML:

  1. <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:big="http://bik.pl/cc/big">
  2. <soapenv:Header/>
  3. <soapenv:Body>
  4. <zapytanie-fin xmlns="http://bik.pl/cc/big" xmlns:ns2="http://bik.pl/cc/big/internal">
  5. <naglowek>
  6. <dane-id nr-ref="111111" id-kli-im="1111111" id-jed-org-kli="1111111" id-operatora="QAZ123456" haslo-operatora="haslo" zn-danych-test="true" zn-powt-operacji="false"/>
  7. <typ-zapyt kod-rodz-zapyt="62" czas-zapyt="2014-10-07T08:18:00"/>
  8. </naglowek>
  9. <dane>
  10. <forma-pr-podm forma-pr-podm="01"/>
  11. <dane-id-kons seria-nr-dok-tozs="ab123456" rodz-dok-tozs="DO" pesel="78542125695" nazw="nazwisko" imie="imie" form-przek-nazw-i-im="01"/>
  12. <daty-upow data-up-24-1="2014-10-07T00:00:00" data-up-bik="2014-10-07T00:00:00" data-up-zbp="2014-10-07T00:00:00"/>
  13. </dane>
  14. </zapytanie-fin>
  15. </soapenv:Body>
  16. </soapenv:Envelope>



Kod PHP z próbą wywołania funkcji:
  1. $nag = http://www.php.net/array
  2. (
  3. "dane-id"=>array
  4. (
  5. "nr-ref" => "111111",
  6. "id-kli-im"=>"1111111",
  7. "id-jed-org-kli"=>"1111111",
  8. "id-operatora"=>"QAZ123456",
  9. "haslo-operatora"=>"haslo",
  10. "zn-danych-test"=>"true",
  11. "zn-powt-operacji"=>"false"
  12. ),
  13. "typ-zapyt"=>array
  14. (
  15. "kod-rodz-zapyt" => "62",
  16. "czas-zapyt" => "2014-10-07T08:18:00"
  17.  
  18. )
  19.  
  20. );
  21.  
  22. $dane = http://www.php.net/array
  23. (
  24. "forma-pr-podm" => http://www.php.net/array
  25. (
  26. "forma-pr-podm" => "01"
  27. ),
  28. "dane-id-kons" => http://www.php.net/array
  29. (
  30. "seria-nr-dok-tozs" => "ab123456",
  31. "rodz-dok-tozs" => "DO",
  32. "pesel" => "78542125695",
  33. "nazw" => "nazwisko",
  34. "imie" => "Imie",
  35. "form-przek-nazw-i-im" => "01"
  36. ),
  37. "daty-upow" => http://www.php.net/array
  38. (
  39. "data-up-24-1" => "2014-10-07T00:00:00",
  40. "data-up-bik" => "2014-10-07T00:00:00",
  41. "data-up-zbp" => "2014-10-07T00:00:00"
  42. )
  43. );
  44.  
  45. $param3 = http://www.php.net/array("naglowek"=>$nag ,"dane"=>$dane);
  46.  
  47. try {
  48. $result = $client->__soapCall("nazwa_funkcji",http://www.php.net/array($param3));
  49. http://www.php.net/print_r($result);
  50.  
  51. } catch (SoapFault $exception) {
  52. http://www.php.net/echo $exception;
  53. }
  54.  


Wywołąnie funkcji w ten sposób daje w odpowiedzi błąd.
Wydaje mi się, że parametr array($param3) wywołania funkcji nie odpowiada plikowi XML.
Proszę o pomoc w prawidłowym zbudowaniu tego parametru.
Z góry dziękuję.

Napisany przez: Pyton_000 7.10.2014, 13:02:02

http://stackoverflow.com/questions/15300843/creating-a-soap-call-using-php-with-an-xml-body

Napisany przez: czesio159 7.10.2014, 13:38:23

Dzięki za szybką odpowiedź.
Więc zrobiłem tak:


  1. $xml = "<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:big="http://bik.pl/cc/big">
  2. <soapenv:http://www.php.net/header/>
  3. <soapenv:Body>
  4. <zapytanie-fin xmlns="http://bik.pl/cc/big" xmlns:ns2="http://bik.pl/cc/big/internal">
  5. <naglowek>
  6. <dane-id nr-ref="111111" id-kli-im="1111111" id-jed-org-kli="1111111" id-operatora="QAZ123456" haslo-operatora="haslo" zn-danych-test="true" zn-powt-operacji="false"/>
  7. <typ-zapyt kod-rodz-zapyt="62" czas-zapyt="2014-10-07T08:18:00"/>
  8. </naglowek>
  9. <dane>
  10. <forma-pr-podm forma-pr-podm="01"/>
  11. <dane-id-kons seria-nr-dok-tozs="ab123456" rodz-dok-tozs="DO" pesel="78542125695" nazw="nazwisko" imie="imie" form-przek-nazw-i-im="01"/>
  12. <daty-upow data-up-24-1="2014-10-07T00:00:00" data-up-bik="2014-10-07T00:00:00" data-up-zbp="2014-10-07T00:00:00"/>
  13. </dane>
  14. </zapytanie-fin>
  15. </soapenv:Body>
  16. </soapenv:Envelope>";
  17.  
  18.  
  19. $params = new \SoapVar($xml, XSD_ANYXML);
  20.  
  21. try {
  22.  
  23. $result = $client->__soapCall("nazwa_funkcji",array($params));
  24. //$result = $client->Echo($params);
  25. print_r($result);
  26.  
  27. } catch (SoapFault $exception) {
  28. echo $exception;
  29. }
  30.  


Może to coś pomoże?

teraz w odpowiedzi dotrzymuję błąd:
  1. SoapFault exception: [soap:Client] Parameter {http://schemas.xmlsoap.org/soap/envelope/}Envelope does not exist! in /var/strony/testy/soa/index.php:116 Stack trace: #0 /var/strony/testy/soa/index.php(116): SoapClient->__soapCall('nazwa_funkcji', Array) #1 {main}



Napisany przez: Pyton_000 7.10.2014, 13:51:27

$xml ujmij w ' zamiasj "

Napisany przez: czesio159 7.10.2014, 14:11:05

Cytat
$xml ujmij w ' zamiasj "


Nie pomogło, ten sam błąd.
Kurcze, cały dzień kombinuje, przeszukuje internet i nie mam już pomysłu jak to przejść.

Może ta informacja na coś was naprowadzi.
Otórz wcześniej wywoływałem inną funkcję ze znacznie mniej skomplikowanym parametrem.
Przykładowy XML do jej wywołania:
  1. <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:big="http://bik.pl/cc/big">
  2. <soapenv:Header/>
  3. <soapenv:Body>
  4. <big:status-systemu>
  5. <big:typ-komunikatu>5</big:typ-komunikatu>
  6. </big:status-systemu>
  7. </soapenv:Body>
  8. </soapenv:Envelope>


Więc robiłem tak:
  1. $param = http://www.php.net/array("typ-komunikatu"=>5);
  2.  
  3. $options = http://www.php.net/array( 'SOAPAction' => 'http://bik.pl/binari/ws/pobranie-rap-fin' );
  4. try {
  5. $result = $client->__soapCall("status-systemu", http://www.php.net/array($param));
  6.  
  7. http://www.php.net/print_r($result);
  8.  
  9. } catch (SoapFault $exception) {
  10. http://www.php.net/echo $exception;
  11. }


Odpowiedź tą metodą dostaje prawidłową.
Natomiast jak wywołam funkcję metodą jak post wyżej, tzn tak:

  1. $xml2 = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:big="http://bik.pl/cc/big">
  2. <soapenv:Header/>
  3. <soapenv:Body>
  4. <big:status-systemu>
  5. <big:typ-komunikatu>5</big:typ-komunikatu>
  6. </big:status-systemu>
  7. </soapenv:Body>
  8. </soapenv:Envelope>';
  9.  
  10. $param1 = new \SoapVar($xml2, XSD_ANYXML);
  11.  
  12. try {
  13. $result = $client->__soapCall("status-systemu", http://www.php.net/array($param1));
  14.  
  15. http://www.php.net/print_r($result);
  16.  
  17. } catch (SoapFault $exception) {
  18. http://www.php.net/echo $exception;
  19. }


Nadal dostaje w odpowiedzi błąd:
  1. SoapFault exception: [soap:Client] Parameter {http://schemas.xmlsoap.org/soap/envelope/}Envelope does not exist! in /var/strony/testy/soa/index.php:122 Stack trace: #0 /var/strony/testy/soa/index.php(122): SoapClient->__soapCall('status-systemu', Array) #1 {main}


Wygląda na to, że podany parametr jest źle zbudowany.
Proszę o wszelką pomoc.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)