Próbuję połączyć się z usługą internetową, która jest chroniona hasłem, a adres URL to https. Nie mogę wymyślić, jak przeprowadzić uwierzytelnianie, zanim skrypt wyśle żądanie. Wygląda na to, że składa zapytanie, gdy tylko zdefiniuję usługę. Na przykład, jeśli kładę się:Połączenie z usługą WWW chronioną przez WS-Security za pomocą PHP
$client = new SoapClient("https://example.com/WSDL/nameofservice",
array('trace' => 1,)
);
a następnie przejść do witryny w przeglądarce, otrzymuję:
Fatal error: Uncaught SoapFault exception:
[WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from
'https://example.com/WSDL/nameofservice' in /path/to/my/script/myscript.php:2
Stack trace: #0 /path/to/my/script/myscript.php(2):
SoapClient->SoapClient('https://example...', Array) #1 {main} thrown in
/path/to/my/script/myscript.php on line 2
Gdy próbuję definiowanie usługę jako serwer mydło, jak:
$server= new SoapServer("https://example.com/WSDL/nameofservice");
uzyskać:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>WSDL</faultcode>
<faultstring>
SOAP-ERROR: Parsing WSDL:
Couldn't load from 'https://example.com/WSDL/nameofservice'
</faultstring>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
nie mam próbowałem wysłać surową kopertę żądania jeszcze, aby zobaczyć, co zwraca serwer, ale może to być obejście problemu. Miałem jednak nadzieję, że ktoś może mi powiedzieć, jak mogę to skonfigurować za pomocą wbudowanych klas php. Próbowałem dodać do tablicy "userName" i "password", ale to nie było dobre. Problem polega na tym, że nie mogę nawet stwierdzić, czy w ogóle dotarłem do strony zdalnej, nie mówiąc już o tym, czy odmawia ona żądania.
Wow. Dzięki za świetny początek. Okay, więc mówiąc dokładniej, nie jest to uwierzytelnianie http. Jeśli przejdę do adresu URL, nastąpi przekierowanie do logowania, a następnie mogę zobaczyć usługę. W dokumentacji tej usługi mówi, że uwierzytelnianie użytkownika powinno być ustawione w nagłówku SOAP, ale oczywiście widzę, jak to zrobić w PHP. (nazywa się to WS-security, dzieje się to w moim ostatnim wyszukiwaniu w Google i wydaje mi się, że nie jest dobrze zaimplementowane w PHP.) Jeśli znasz sposób na ustawienie nagłówka, lub użyj innej metody, na przykład curl, aby uzyskać usługę i następnie przekazanie tego do SoapClient, byłoby oświecające. – Anthony
Oh! Szybkie pytanie ... Więc skopiowałem usługę do pliku na moim serwerze, jestem w stanie ją skonfigurować. Wciąż nie jestem pewien, jak się w tym poruszać. Ale czy mówiłeś, że usługa będzie działać, gdy nie znajduje się w jej faktycznym miejscu? – Anthony
Poszerzyłem odpowiedź o niektóre punkty dotyczące manipulacji przy pomocy WS-Security i protokołu SOAP za pomocą SoapClient. –