2016-04-29 42 views
6

Jestem nowy na nusoap i ogólnie na usługi sieciowe.NuSoap - Korzystanie z lokalnego, istniejącego pliku WSDL w języku nusoap_client PHP

Plik wsdl pochodzi od klienta. Mam podstawowe usługi internetowej pracuje z domyślnym adresem URL, który dostarcza WSDL poprzez adresem: http://hiddenurl.com/ws/schema/Terminal.wsdl

Ale dokumentacji klienta mówi: „Proszę pobrać pliki WSDL i schematu XML lokalnie na kodzie do użytkowania Nie. pobierz te pliki za każdym razem z naszego serwera. "

Tak więc próbowałem hostować plik wsdl lokalnie lub przez mój własny serwer sieciowy, ale żadne z nich nie działało.

Próbowałem:

$wsdlUrl = 'http://supplied-url.com/schema/Terminal.wsdl' // working but discouraged 

$wsdlUrl = 'http://my-own-IIS-based-url/schema/Terminal.wsdl' // url loads and I can 
    // view wsdl file, but when I load run webservice is returns blank/nothing 

$wsdlUrl = 'path/to/local/Terminal.wsdl' // returns blank or 'boolean'false' 

$tempUrl = realpath('path/to/local/Terminal.wsdl') // get absolute url 
wsdlUrl = tempUrl; // returns blank screen or 'boolean'false' 

Czy jest jakiś sposób mogę mieć usługę internetową użyć pliku WSDL z lokalizacji innej niż ta, pierwotnie dostarczonego przez klienta? Widziałem kilka odwołań do serwerów WWW zwracających wsdl z rodzajem http://getfile.php?file.wsdl, ale nie rozumiem, co byłoby w "getfile.php" w celu dostarczenia wsdl za pośrednictwem ciągu zapytania.

Oto mój kod PHP, aby zadzwonić do usługi internetowej. Znów działa z adresem URL podanym przez klienta dla pliku wsdl, ale nie wtedy, gdy próbuję uzyskać dostęp do pliku wsdl w jakikolwiek inny sposób.

<?php 
require_once('nusoap.php'); 

$URI = 'http://api.hiddenurl.com/ws/schema'; 

$env = 'api'; 
$wsdlUrl = 'http://'.$env.'.hiddenurl.com/schema/Terminal.wsdl'; 
$licenseKey = 'xxxx-xxxx-xxxx-xxxx-xxxx'; 
$userName = 'user'; 
$password = 'password'; 

$service = new nusoap_client($wsdlUrl, true); 

// login credentials 
$service->setHeaders(
'<wsse:Security xmlns:wsse="http://hiddenurl.xsd">'. 
'<wsse:UsernameToken>'. 
'<wsse:Username>'.$userName.'</wsse:Username>'. 
'<wsse:Password Type="http://hiddenurl#PasswordText">'.$password.'</wsse:Password>'. 
'</wsse:UsernameToken>'. 
'</wsse:Security>' 
); 

$msg = 
'<GetDetailsRequest xmlns="'.$URI .'">'. 
'<messageId></messageId>'. 
'<version></version>'. 
'<licenseKey>'.$licenseKey.'</licenseKey>'. 
'<iccids>'. 
'<iccid>'.'xxxxxxxxxxxxxxx'.'</iccid>'. 
'</iccids>'. 
'</GetDetailsRequest>'; 

$result = $service->call('GetlDetails', $msg); 

if ($service->fault) { 
    echo 'faultcode: ' . $service->faultcode . "\n"; 
    echo 'faultstring: ' . $service->faultstring . "\n"; 
    echo 'faultDetail: ' . $service->faultdetail . "\n"; 
    echo 'response: ' . $service->response; 
    exit(0); 
} 

echo "<pre>"; 
var_dump($result); 
echo "</pre>"; 

?> 

Wielkie dzięki.

+0

'ścieżka/do/local/Terminal.wsdl' powinno działać - są na pewno jesteś przejazdem we właściwej ścieżce? Jaka jest zwracana wartość 'file_exists ('path/to/local/Terminal.wsdl')'? – FuzzyTree

+1

Dzięki za komentarz. 'file_exists ('path/to/local/Terminal.wsdl')' zwraca 1, z których zakładam '1 == true'. – 100pic

+0

najnowsze wersje php pochodzą z natywnym klientem mydła (https://secure.php.net/manual/en/class.soapclient.php), jeśli zmiana klientów jest możliwa sugeruję wypróbowanie klienta natywnego – FuzzyTree

Odpowiedz

5

Spróbuj

$wsdl_location= realpath('path/to/local/Terminal.wsdl'); 
$wsdl_cache = new nusoap_wsdlcache("/tmp"); // for caching purposes 
$wsdl_obj = $wsdl_cache->get($wsdl_location); 
if (empty($wsdl_obj)) { 
    $wsdl_obj=new wsdl($wsdl_location); 
    $wsdl_cache->put($wsdl_obj); 
} 
$service = new nusoap_client($wsdl_obj,true); 
0

Spróbuj użyć ścieżki localhost:

$ wsdlUrl = 'http://localhost/schema/Terminal.wsdl';

p.s. Ten adres URL nie działa w przeglądarce, ale można go uruchomić za pomocą skryptu php na serwerze.

+1

Dlaczego miałby to być inny niż '$ wsdlUrl = 'http: // mój-własny-oparty na IIS-url/schema/Terminal.wsdl'', który już wypróbował – Christiaan