Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [Soap] Klient - problem z nagłówkami
markuz
post
Post #1





Grupa: Zarejestrowani
Postów: 1 240
Pomógł: 278
Dołączył: 11.03.2008

Ostrzeżenie: (0%)
-----


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.

Ten post edytował markuz 24.06.2014, 09:30:48


--------------------
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 11)
kartin
post
Post #2





Grupa: Zarejestrowani
Postów: 246
Pomógł: 79
Dołączył: 25.05.2010

Ostrzeżenie: (0%)
-----


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.


--------------------
Jeśli ten post pomógł to kliknij przycisk po lewej stronie.
Nie pomagam przez PW, GG, e-mail, faks, telegram, znaki dymne, ...
Go to the top of the page
+Quote Post
markuz
post
Post #3





Grupa: Zarejestrowani
Postów: 1 240
Pomógł: 278
Dołączył: 11.03.2008

Ostrzeżenie: (0%)
-----


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)?

Ten post edytował markuz 24.06.2014, 13:18:03


--------------------
Go to the top of the page
+Quote Post
mortus
post
Post #4





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
kartin
post
Post #5





Grupa: Zarejestrowani
Postów: 246
Pomógł: 79
Dołączył: 25.05.2010

Ostrzeżenie: (0%)
-----


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());


--------------------
Jeśli ten post pomógł to kliknij przycisk po lewej stronie.
Nie pomagam przez PW, GG, e-mail, faks, telegram, znaki dymne, ...
Go to the top of the page
+Quote Post
markuz
post
Post #6





Grupa: Zarejestrowani
Postów: 1 240
Pomógł: 278
Dołączył: 11.03.2008

Ostrzeżenie: (0%)
-----


@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

Ten post edytował markuz 24.06.2014, 13:31:03


--------------------
Go to the top of the page
+Quote Post
kartin
post
Post #7





Grupa: Zarejestrowani
Postów: 246
Pomógł: 79
Dołączył: 25.05.2010

Ostrzeżenie: (0%)
-----


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

Ten post edytował kartin 24.06.2014, 13:36:04


--------------------
Jeśli ten post pomógł to kliknij przycisk po lewej stronie.
Nie pomagam przez PW, GG, e-mail, faks, telegram, znaki dymne, ...
Go to the top of the page
+Quote Post
markuz
post
Post #8





Grupa: Zarejestrowani
Postów: 1 240
Pomógł: 278
Dołączył: 11.03.2008

Ostrzeżenie: (0%)
-----


@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?

Ten post edytował markuz 24.06.2014, 13:46:58


--------------------
Go to the top of the page
+Quote Post
kartin
post
Post #9





Grupa: Zarejestrowani
Postów: 246
Pomógł: 79
Dołączył: 25.05.2010

Ostrzeżenie: (0%)
-----


  1. $client->Logon( array('nazwa1parametru'=>'TEST1', 'nazwa2parametru'=>'ASD123', 'nazwa3parametru'=>'1.0.0.3') );


--------------------
Jeśli ten post pomógł to kliknij przycisk po lewej stronie.
Nie pomagam przez PW, GG, e-mail, faks, telegram, znaki dymne, ...
Go to the top of the page
+Quote Post
markuz
post
Post #10





Grupa: Zarejestrowani
Postów: 1 240
Pomógł: 278
Dołączył: 11.03.2008

Ostrzeżenie: (0%)
-----


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?


--------------------
Go to the top of the page
+Quote Post
Turson
post
Post #11





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

Ostrzeżenie: (0%)
-----


Jest takie fajne narzędzie - Soap UI. Bez PHP możesz przeprowadzić symulację żądania.
Go to the top of the page
+Quote Post
markuz
post
Post #12





Grupa: Zarejestrowani
Postów: 1 240
Pomógł: 278
Dołączył: 11.03.2008

Ostrzeżenie: (0%)
-----


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.

Ten post edytował markuz 3.07.2014, 14:45:14


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 17:13