Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Soap] Klient - problem z nagłówkami
Forum PHP.pl > Forum > PHP
markuz
Witam,

Próbuję się połączyć za pomocą SoapClient z usługą:

  1. <?php
  2.  
  3. $soapClientParams = array(
  4. "trace" => 1,
  5. 'soap_version' => SOAP_1_2,
  6. 'style' => SOAP_DOCUMENT,
  7. 'encoding' => SOAP_LITERAL,
  8. 'cache_wsdl' => WSDL_CACHE_NONE
  9. );
  10.  
  11. try {
  12. $soapClient = new SoapClient('http://domena.pl:81/xxx/xxx.svc?wsdl', $soapClientParams);
  13. $results = $soapClient->GetRole();
  14. } catch (Exception $e) {
  15. echo $e->getMessage();
  16. }


W odpowiedzi dostaję: Error Fetching http headers

To moja pierwsza styczność z tego typu "połączeniem". Czy ktoś z Was kiedyś korzystał z soap-a w PHP? Czy do połączenia zazwyczaj wymagane są dane do logowania? Niestety nie mogę udostępnić publicznie pliku xxx.svc.
kartin
Wszystko zależy od usługi. W dokumentacji usługi powinna być informacja czy logowanie jest wymagane, a jeśli tak to w jaki sposób.
markuz
W tym problem, że nie istnieje coś takiego jak dokumentacja usługi smile.gif A można to wywnioskować na podstawie pliku .svc (xml/wsdl) czy tylko ze źródła tej usługi (napisanej w vb)?
mortus
Błąd często spotykany, gdy połączenie z serwisem trwa dłużej, niżbyśmy oczekiwali. Zwiększ timeout, albo w pliku php.ini albo w kodzie:
  1. $old = ini_get('default_socket_timeout');
  2. ini_set('default_socket_timeout', 5);
  3. $params = array(
  4. 'trace' => true,
  5. 'connection_timeout' => 5,
  6. ...
  7. );

Oczywiście serwis pod wskazanym adresem musi być dostępny.
kartin
Ze źródła usługi na pewno można wywnioskować.
W WDSL możesz sprawdzić, czy jest jakaś funkcja której nazwa sugeruje, że służy do logowania.
  1. var_dump($soapClient->__getFunctions());
markuz
@mortus
Już próbowałem - nic to nie dało.
Serwis jak najbardziej jest dostępny. Dane logowania CHYBA nie są wymagane ponieważ mogę pobrać funkcje i typy za pomoca : __getFunctions() i __getTypes().

@kartin
Mam funkcję LogonResponse Logon(Logon $parameters) - jak się do niej prawidłowo odnieść? Ze źródeł wiem, że argumentami są:
Kod
Public Function Logon(Name As String, Password As String, Version As System.Version) As LogonResult Implements ICutter.Logon


Próbowałem dużo różnych "kombinacji" za każdym razem jest problem z nagłówkiem - albo z kodowaniem albo Error Fetching http headers. Zaraz wyłapię ten z kodowaniem żebyście dokładnie wiedzieli - może ktoś coś smile.gif
kartin
Cytat(markuz @ 24.06.2014, 14:27:42 ) *
Dane logowania CHYBA nie są wymagane ponieważ mogę pobrać funkcje i typy za pomoca : __getFunctions() i __getTypes().
To nie ma żadnego związku z koniecznością logowania lub jej brakiem.

  1. $soapClient->Logon( array('Name'=>'aaaa', 'Password'=>'pppp', 'Version'=>'11')
Dla pewności sprawdź jakie nazwy parametrów są podane w typie Logon
markuz
@kartin - Myślałem, że logowanie powinno się odbywać jeszcze przed możliwością pobrania funkcji tzn. z konstruktora SoapClient. Ale skoro mówisz inaczej - to bd próbował z tym Logon coś zrobić.

  1. try {
  2. $results = $client->Logon('TEST1', 'ASD123', '1.0.0.3');
  3. } catch (Exception $e) {
  4. echo $e->getMessage();
  5. }


Błąd: Cannot process the message because the content type 'text/xml; charset=utf-8' was not the expected type 'application/soap+xml; charset=utf-8'.
Opcje? smile.gif

Dodatkowo SoapFault Object (Exception) zwraca:

Kod
[trace:Exception:private] => Array
        (
            [0] => Array
                (
                    [function] => __doRequest
                    [class] => SoapClient
                    [type] => ->
                    [args] => Array
                        (
                            [0] =>
ASD1231.0.0.3

                            [1] => .....
                            [2] => http://tempuri.org/ICutter/Logon <-------------
                            [3] => 1
                            [4] => 0
                        )

                )

Strzałką zaznaczyłem 3 argument -> http://tempuri.org/ - wątpię aby to mogło zadziałać - więc wina jest pewnie po ich stronie - tak?
kartin
  1. $client->Logon( array('nazwa1parametru'=>'TEST1', 'nazwa2parametru'=>'ASD123', 'nazwa3parametru'=>'1.0.0.3') );
markuz
To nic nie zmienia. Nadal błędy te same.

Teraz się dowiedziałem, że:
- Usługa używa SOAP w wersji 1.2 (to da się zmienić w parametrze $options SoapClient)
- Usługa używa Reliable Sessions
I o tym drugim nie mogę znaleźć żadnej informacji która odnosiła by się w jakikolwiek sposób do PHP-a. Słyszał ktoś o czymś takim?
Turson
Jest takie fajne narzędzie - Soap UI. Bez PHP możesz przeprowadzić symulację żądania.
markuz
Korzystałem z niego i albo nie potrafię poprawnie skonfigurować połączenia albo coś jest nie tak z usługą - chociaż programista od usługi twierdzi, że wszystko jest ok ponieważ łączy się przez nią w aplikacji (.NET).

1: screen 1
Jako SOAPAction jest http://tempuri.org/ICutter/Logon - tempuri.org to domyślna nazwa (z tego co czytałem powinno się ją zmienić - ale to jest możliwe tylko po stronie usługi - tak?).
2: screen 2
Tutaj widzimy zapytanie oraz odpowiedź. Ustawiony jest SOAP w wersji 1.2 oraz aktywne są WS-Reliable Messaging

Ktoś widzi jakiś błąd który mógł powodować taką odpowiedź (błędną)?



@EDIT

Namespace zostało zmienione na "chyba" poprawne.

Teraz SoapUI zwraca:
Cytat
The action http://xxx/ICutter/Logon is not supported by this endpoint. Only WS-ReliableMessaging February 2005 messages are processed by this endpoint.


Nie mam zdefiniowanego "endpoint" ponieważ nie wiem co to jest.

Znalazłem taką definicję:
Cytat
Sender's responder (endpoint)
To receive an asynchronous Acknowledgment the sender must have an endpoint to handle them. The WSRMSequenceAcknowledgment() procedure must be exposed at that endpoint. This accepts and processes asynchronous Acknowledgment. This is used to accept a SequenceAcknowledgment response from a remote party so it will process the response and will set the state of messages that are acknowledged.


Po stronie PHP-a nawet nie doszedłem do tego błędu - zatrzymałem się na błędzie z nagłówkami.

Może ktoś miał kiedyś taki problem? Komuś udało się poprawnie skonfigurować klient-a w PHP? Próbowałem znaleźć jakieś informacje na temat WS-Reliable Messaging w PHP, jedyne co znalazłem to autoryzacja która mnie nie dotyczy - ponieważ ja wykonuję autoryzację poprzez odwołanie do Logon.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.