2013-01-16 8 views
6

Komunikuję się z usługą sieciową w SOAP z php. Oto mój kod:PHP SoapClient zniekształcone xml

$data = array('name' => 'test', 'age' => 20); 
$WDSL = 'http://xxx.xxxxx.xxx/wdsl.ibs?wsdl'; 
$SOAP = new SoapClient($WDSL, array('trace' => true)); 
$RESULT = $SOAP->__soapCall('Some_Service', $data); 

Z jakiegoś powodu, XML jest źle:

<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:Some_Crap"><SOAP-ENV:Body><ns1:Some_Service/><param1>test</param1><param2>20</param2> ... 

Jak to nazwa węzła XML jest paramX gdy powinna być nazwa zmiennej? Co ja robię źle ??

Dzięki

Aktualizacja: Więc mam wymienione funkcje z tym usługa i co pojawia się:

Some_Service_Response Some_Service(Some_Service $parameters)) 

zmieniłem moje wołanie tak jest teraz:

$SOAP->__call('Some_Service', array('Some_Service', $data)); 

Kod XML nadal jest nieprawidłowy:

<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV=" 
http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:ns1="urn:iwaysoftware:ibse:jul2003:HR_Master"><SOAP-ENV:Body><ns1:Some_Service/> 
<param1><item><key>SomeKey</key><value>SomeValue</value> .... 

Nadal dostaję <param1><item><key>SomeKey</key><value>SomeValue</value> instead of <Somekey>SomeValue</Somekey>

Pytanie brzmi, czy usługa sieci Web nie działa poprawnie lub czy jest po mojej stronie?

Odpowiedz

4

Gdybym był tobą, spróbowałbym ustawić $ dane w formacie obiektu.

$data = array('name' => 'test', 'age' => 20); 

Na przykład:

$data = null; 
$data->name = "test"; 
$data->age = 20; 

$RESULT = $SOAP->__soapCall('Some_Service', $data); 
+0

To już jest przypadek. – Eric

+0

@Eric W pytaniu '$ data' jest tablicą, a nie obiektem. –

+0

Przepraszam, tak, masz rację :) – Eric

7

Klasa SoapClient dokonuje wielu korekt na podstawie WSDL usługi, np. usuwa nieprawidłowe tagi. Sprawdź WSDL, może on zawierać nazwę parametrów: param1 i param2.

Wywołanie SoapClient::__getFunctions() i SoapClient::__getTypes() i zrzucenie wyników daje dość dobre podsumowanie tego, co PHP rozumie z twojego WSDL.


(Po OP zaktualizowane pytanie, które od wyjścia SoapClient::__getFunctions() jest:

Some_Service_Response Some_Service(Some_Service $parameters)) 

)

Zwykle kluczem tablica jest nazwą parametru, a nie typu. Tak więc moje pierwsze przypuszczenie byłoby następujące:

$SOAP->__call('Some_Service', array('parameters', $data)); 

Problem może być jednak po stronie serwera. Niezgodności WSDL czasami wymagają ręcznego dostrojenia plików WSDL, aby PHP wysyłało te same pliki XML, które są potrzebne.

Ale zanim wykonasz jakiekolwiek hakowanie (jeśli masz taką możliwość), koniecznie wypróbuj usługę bez PHP, aby zobaczyć reakcję usługi na różne pliki XML. Dobry program o nazwie SoapUI może to dla ciebie zrobić, automatycznie generuje kody pośredniczące XML do przetestowania. (Miałem problemy tylko z SoapUI z usługami sieciowymi, które wymagały podpisów cyfrowych.)

Bazując na wynikach XML testowania może trzeba:

  • Ręczne dostrojenie WSDL
  • wygenerować plik XML ręcznie i wysłać to do serwera (w ostateczności)
  • Jeśli kod XML jest prawie poprawny, wystarczy niewielkie dostrojenie, które można również uzyskać z klasy SoapClient i zastąpić metodę SoapClient::__doRequest, aby wykonać manipulację ciągami w pliku XML przed przesłaniem jej do serwera (przez wywołanie __dorequest bazy klasa). Jeden z przykładów, gdy użyłem tego rozwiązania, gdy usługa internetowa wymagała ponownego wyświetlenia niektórych atrybutów XML w przypadku niektórych tagów.
+0

Nie, nie ma czegoś takiego w WSDL .. – Eric

+0

Oto co mam: Array ([0] => struct ibsinfo {usługa ciąg; ciąg metoda, licencja łańcuchowa, rozmieszczenie ciągów znaków, ciąg znaków Nazwa użytkownika, ciąg Hasło, język ciągu znaków;} [1] => struct adapterexception {string error;} [2] => struct Some_Service {Some_Service_ComplexType hr_master;} [3] => struct Some_Service_ComplexType { WS_Transaction_ID WS_Transaction_ID; Web_Service_Request_Type ... – Eric

+1

Proszę umieścić w pytaniu b ecause (a) tam się znajduje (b) komentarze nie mogą zawierać znaków nowej linii w celu poprawy czytelności (c) komentarze mają ograniczoną długość, a interesująca część jest niedostępna – Csq