2009-08-25 11 views
5

Próbuję użyć usługi sieciowej do wyszukiwania określonych użytkowników z mojej aplikacji PHP. Użyłem tego samego tego samego serwisu w ASP.NET z powodzeniem.PHP 5 Klient SOAP zwraca NULL, gdy funkcja dostarczana przez WSDL nazywa się

Zasadniczo robię wszystko, co dokumentacja PHP mówi mi, i używam tych samych metod/zmiennych, których użyłem w ASP.NET (dla samej usługi), ale nie mogę uzyskać wyniku.

Funkcja jest wymieniony w __getFunctions() i powinien wrócić anyType, które, jeśli dobrze rozumiem, to odpowiednik mixed w PHP:

array(1) { [0]=> string(63) "anyType basicSearch(string $sharedSecret, string $searchParams)" } 

Kiedy mów basicSearch(), choć wydaje się, zwraca NULL .

Funkcja basicSearch() ma zwrócić dokument XML zawierający te informacje. W ASP.NET zwykłem po prostu rzutować odpowiedź na, jak sądzę, i XmlDocument. Czy powinienem to zrobić również w PHP? Z jaką reprezentacją dokumentu XML (SimpleXML, DOM, itp.)?

Czy może być wyświetlany jako NULL tylko dlatego, że PHP nie może zrozumieć formatu?

Czy robię coś złego w PHP? A może powinienem zajrzeć do samej usługi i spróbować debugować po tej stronie?

<?php 
    $client = new SoapClient($wsdl_url); 

    echo $client->__getFunctions(); 
    echo "<br />\n"; 
    echo $client->basicSearch($key, $req); 
?> 

PS: Używam biblioteki PHP 5. Może mogłoby pomóc użycie innej biblioteki, takiej jak nu-soap? Wygląda na to, że jest więcej dokumentów online na ten temat.


Aktualizacja:

Korzystanie tablicę przejść parametr nie działa, SOAP przewiduje osobne argumenty. Wywołanie __getLastRequest() zwraca ciąg znaków konkatenacji $ key i $ req bez żadnego innego XML. Wywołanie __getLastResponse() zwraca pusty łańcuch. Żadne wyjątki nie są wrzucane. Wygląda na to, że PHP nie wie, co zrobić z argumentami, które mu podaję, mimo że przetworzył plik WSDL, ponieważ dostaję funkcję, której używam na liście, kiedy wywołuję __getFunctions().

Każda pomoc zostanie doceniona.

Aktualizacja ": Nadal nie działa żadne rozwiązanie. Jestem zdziwiony ...

+0

Zauważ, że powtarzając tablicę zawsze daje „Array”, bo to jest jak tablica konwertuje ciąg znaków. spróbuj użyć funkcji print_r() lub var_dump(). –

+0

Tak, teraz dostaję prawidłową funkcję. Dziękuję, naprawdę to wiedziałem i tęskniłem za tym. Problem został zaktualizowany. –

+0

Twój przykład kodu nie sprawdza wyjątków, które mogą zostać odrzucone przez klienta - czy anulowałeś to dla uproszczenia przykładu? Jeśli nie, sugeruję dodanie tego testu za pomocą try/catch, ponieważ może to dać przydatne komunikaty o błędach. –

Odpowiedz

4

Znalazłem to wszystko dość zagmatwane, kiedy zacząłem używać bibliotek SoapClient w php. Właściwym sposobem formatowania tych rzeczy jest następujący:

$client = new SoapClient($wsdl_url, array("trace" => 1)); 

$params = array(
    "sharedSecret" => "thisIsSomeSecret", 
    "searchParams" => "thisIsSomeSearchParam" 
); 

$response = $client->basicSearch($params); 

Nie widząc reakcję, nie mogę powiedzieć, jak odwołać parametry zwracane, ale sposób jego przechowywany jest jako var użytkownik obiektu stdClass . Taki, że odwołujesz się do takich zwrotów ...

$ reponse-> paramName;

Miła trik jeśli trzymać array („ślad” => 1) Ustaw opcje tam jest, że można nazwać te dwie funkcje ....

$respXML = $client->__getLastResponse(); 
$requXML = $client->__getLastRequest(); 

... aby zobaczyć rzeczywisty xml, który zostanie wysłany, aby sprawdzić, czy jest dobrze uformowany. Ostrożnie, SoapClient jest dość błędny. O wiele lepiej niż nusoap, nie idź za tym śmieciem.

+1

Nie zgadzam się z notacją/uwagą na temat formatu: przekazujesz argumenty jako tablicę tylko wtedy, gdy użyjesz '$ client -> __ soapCall ($ functionName, $ arguments)' mehtod, który jest przeznaczony głównie do nie używania WSDL. Jeśli używasz WSDL, powinieneś wywoływać funkcje bezpośrednio po nazwie, przekazując argumenty osobno, tak jak robi to OP. –

+0

Ale zgadzam się na użycie opcji śledzenia i __getLastRequest() w celu sprawdzenia rzeczywistej zwracanej wartości. –

+0

Jak wspomniał Henrik Opel, metoda tablicowa nie działa. PHP narzeka na brak wymaganego parametru. Kiedy używam śledzenia i __getLastRequest() i __getLastResponse(), otrzymuję konkatenację pierwszego parametru, a drugi jako moje żądanie i pusty łańcuch jako odpowiedź, tak jakby PHP nie wiedział, co zrobić z moją prośbą. Wywołanie funkcji __getFunctions() zwraca funkcję, której używam, więc WSDL jest czytane ... Cała ta sprawa jest myląca. –

1

yeap

$ client = new SoapClient ($ wsdl_url, array ("ślad" => 1));

parametr „ślad” pomaga

Powiązane problemy