2015-08-08 1 views
0

Я намерен реализовать веб-сервис с использованием PHP. Создатели веб-сервиса отправили мне WSDL, необходимые по электронной почте, и я смог импортировать их в пользовательский интерфейс Soap и протестировать их.Определения и реализации SOAP UI в PHP

Учитывая, что они работают очень хорошо, мне поручено повторить тот же процесс в моем приложении PHP. Я немного поработал над поиском, чтобы узнать, что PHP5 уже предоставляет SoapClient для использования web-сервисов. Я даже проверил два примера, и они отлично работали. Но не тот, который работал с использованием мыльного интерфейса.

SoapClient получает URI файла WSDL в качестве первого параметра 1 - это URL-адрес службы, отображаемой soapui в верхней строке? Я заметил, что другие веб-службы, которые я тестировал, если uri был скопирован и вставлен в браузер, формат XML будет возвращен с данными о веб-сервисе. Поскольку данные soapui указывали как конечную точку, браузер просто вывел сообщение об ошибке «Lenght Required» 411.

Итак, мой вопрос в том, является ли .xml-файл, который SOAP ui использует для импорта проекта, который я должен указать в моем php? Как:

SoapClient ("file:://C:\users\something\webservice.xml?wsdl", 
['service'=>'login', 'username'=>'something', 'password'=>'secret' ]); 

Я подвергнет .xml я получил информацию о WebService, но я боюсь утечки конфиденциальных данных. Я скопирую заголовок запроса, ommiting конфиденциальных данные

<?xml version="1.0" encoding="UTF-8"?> 
<con:soapui-project activeEnvironment="Default" name="" resourceRoot="" soapui-version="5.2.0" abortOnError="false" runType="SEQUENTIAL" id="" xmlns:con="..."><con:settings/><con:interface xsi:type="con:WsdlInterface" wsaVersion="NONE" name="..." type="wsdl" bindingName="{...}GenericTicketConnector_Service" soapVersion="1_1" anonymous="optional" definition="file:/D:/.../Documents/file.wsdl" id="..." xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><con:settings/><con:definitionCache type="TEXT" rootPart="file:\D:\...\Documents\file.wsdl"><con:part><con:url>file:\D:\...\Documents\file.wsdl</con:url><con:content><![CDATA[<--!...--> 
<wsdl:definitions name="GenericTicketConnector" targetNamespace="http://www.otrs.org/TicketConnector/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://www.otrs.org/TicketConnector/"> 
    <wsdl:documentation/> 
    <!--Warning: This WSDL file is for Development and Test purposes ONLY!--> 
    <wsdl:types> 
    <xsd:schema targetNamespace="http://www.otrs.org/TicketConnector/"> 

После этого файл .xml выглядит как обычный файл WSDL, описывающее WebServices поставки, формат запрос, в откосе ... и т.д. ...

спасибо.

ответ

1

Я не знаком с SoapUI, но для параметра WSDL в CTOR из SoapClient (первый параметр) это не большая разница, если у вас есть как HTTP URL или путь к локальному файлу ,

Рассмотрим следующий пример, который загружает файл WSDL на лету в каталог, где хранится пример сценария, а затем использует локальный файл вместо URL:

// just an example webservice WSDL 
$wsdl = 'http://www.webservicex.net/globalweather.asmx?WSDL'; 

// store the WSDL file in current directory if it does not yet exist 
$filename = __DIR__ . '/globalweather.asmx.wsdl'; 
if (!is_readable($filename)) { 
    file_put_contents($filename, fopen($wsdl, 'r')); 
} 

$soapclient = new SoapClient($filename); 
$params  = ['CountryName' => 'Spain', 'CityName' => 'Alicante']; 
$response = $soapclient->getWeather($params); 

var_dump($response); 

Ответом является (некартированных) stdClass для GetWeatherResult с веб-сервиса. Уже работает вызов $soapclient->getWeather, который будет иметь место только в том случае, если WSDL успешно загружен.

Примечание. В операционной системе Windows знак вопроса («?») недопустим в имени файла, поэтому следите за тем, чтобы вы использовали только допустимые имена файлов.

Файл WSDL содержит все данные, которые должны быть известны для взаимодействия с веб-сервисом. Так что вам больше не нужна информация.

... 
    <wsdl:service name="GlobalWeather"> 
    <wsdl:port name="GlobalWeatherSoap" binding="tns:GlobalWeatherSoap"> 
     <soap:address location="http://www.webservicex.net/globalweather.asmx" /> 
    </wsdl:port> 
... 

Как показывает этот пример, то WSDL содержит конкретный URI, SoapClient (или SoapUI по этому вопросу) будет посылать HTTP-запросы. Попробуйте использовать локальный файл в SoapUI, если он его принимает или нет.


Edit:WSDL file of the OTRS Websvervice is available on Github, вот пример принят к OTRS WebService, просто перечислить методы и типы:

$wsdl = 'https://raw.githubusercontent.com/OTRS/otrs/master/development/webservices/GenericTicketConnectorSOAP.wsdl'; 

// store the WSDL file in current directory if it does not yet exist 
$filename = __DIR__ . '/GenericTicketConnectorSOAP.wsdl'; 
if (!is_readable($filename)) { 
    file_put_contents($filename, fopen($wsdl, 'r')); 
} 

$soapclient = new SoapClient($filename); 
print_r($soapclient->__getFunctions()); 
print_r($soapclient->__getTypes()); 

Выход:

Array 
(
    [0] => TicketCreateResponse TicketCreate(TicketCreate $parameters) 
    [1] => TicketUpdateResponse TicketUpdate(TicketUpdate $parameters) 
    [2] => TicketGetResponse TicketGet(TicketGet $parameters) 
    [3] => TicketSearchResponse TicketSearch(TicketSearch $parameters) 
    [4] => SessionCreateResponse SessionCreate(SessionCreate $parameters) 
) 
... 
+0

Я попытался изменить адрес, чтобы он назвал «файл мыла». Например: '$ client = new SoapClient (" file: /// C: /Users/nb21334/Desktop/OTRSTicketConnector-soapui-project.wsdl ", $ params);' - но я получил ошибку 'SOAP-ERROR: Разбор WSDL: Не удалось найти в 'файле: /// C:/Users (остальная часть пути к файлу) '- Я пробовал с расширениями .xml и .wsdl. – Thaenor

+1

Похоже, что файл WSDL является неполным. Обратитесь в OTRS и спросите их, что такое '' из Webservice и почему этот элемент отсутствует в файле WSDL. У них может быть причина для этого. В зависимости от того, что отсутствует, вы также можете предоставить данные через параметры. – hakre

+0

Я думаю, что не использую нужный файл. Либо мне нужно сгенерировать сам wsdl, либо что-то еще отсутствует. Есть ли способ, которым я могу вручную написать xml, который привязан к запросу и вручную отправил его на серверы? Ошибка, которую я получаю, происходит из-за того, что я не загружаю правильный wsdl в php. (на PHP запрос даже не отправляется, я знаю это, потому что я получаю точно такую ​​же ошибку независимо от того, чтобы быть в сети или в автономном режиме) – Thaenor

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