2016-04-29 2 views
6

Я новичок в nusoap и веб-сервисах в целом.NuSoap - Как использовать локальный, существующий файл WSDL в nusoap_client PHP

Файл wsdl поступает от клиента. У меня есть основные веб-службы работы с URL по умолчанию, который поставляет WSDL через веб-адрес: http://hiddenurl.com/ws/schema/Terminal.wsdl

Но документации клиента говорит: «Пожалуйста, загрузите WSDL и XML-схемы файлы локально для вашего кода, чтобы использовать Не. получать эти файлы каждый раз с нашего сервера ».

Так что я пытался разместить файл wsdl локально или через собственный веб-сервер, но ни один из них не работал.

Я попытался:

$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' 

Есть ли способ я могу иметь веб-службу с помощью файла WSDL из места, кроме того, первоначально предоставленного клиентом? Я видел некоторые ссылки на веб-серверы, возвращающие wsdl со своего рода http://getfile.php?file.wsdl, но я не понимаю, что было бы в 'getfile.php', чтобы доставить wsdl через строку запроса.

Вот мой код PHP для вызова веб-службы. Опять же, он работает с URL-адресом клиента для файла wsdl, но не тогда, когда я пытаюсь получить доступ к файлу wsdl любым другим способом.

<?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>"; 

?> 

Большое спасибо.

+0

'путь/к/местные/Terminal.wsdl' должны работать - вы уверены, что вы передаете в правильном пути? Каково возвращаемое значение 'file_exists '(' путь/to/local/Terminal.wsdl ')'? – FuzzyTree

+1

Спасибо за ваш комментарий. 'file_exists ('path/to/local/Terminal.wsdl')' возвращает 1, из которых я принимаю '1 == true'. – 100pic

+0

последние версии php поставляются с родным клиентом soap (https://secure.php.net/manual/en/class.soapclient.php), если изменение клиентов - это возможность предложить попробовать собственный клиент – FuzzyTree

ответ

5

Попробуйте

$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

Попробуйте использовать путь LOCALHOST:

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

p.s. Этот URL-адрес не будет работать в браузере, но может выполняться через php-скрипт на сервере.

+1

Почему это было бы иначе, чем '$ wsdlUrl = 'http: // my-own-IIS-url/schema/Terminal.wsdl'', который он уже пробовал – Christiaan

Смежные вопросы