|
|
|
| собственно никогда не работал с soap.
есть сервис, реализованный через WSDL.
задача научиться писать и получать запросы.
документация отсутствует.
как вытащить информацию по работе с этим сервисом?
создал экземпляр класса:
$client = new SoapClient('url', array('soap_version' => SOAP_1_1));
|
далее смотрю доступные методы:
var_dump($client->__getFunctions());
|
получаю:
array(8) {
[0]=>
string(80) "PackageSearchOptionsResponse GetOptions(PackageSearchOptionsRequest $parameters)"
[1]=>
string(62) "PackageSearchResponse Search(PackageSearchRequest $parameters)"
[2]=>
string(83) "PackagePriceDynamicResponse GetPriceDynamic(PackagePriceDynamicRequest $parameters)"
[3]=>
string(111) "GetDetailedSearchResultItemResponse GetDetailedSearchResultItem(GetDetailedSearchResultItemRequest $parameters)"
[4]=>
string(80) "PackageSearchOptionsResponse GetOptions(PackageSearchOptionsRequest $parameters)"
[5]=>
string(62) "PackageSearchResponse Search(PackageSearchRequest $parameters)"
[6]=>
string(83) "PackagePriceDynamicResponse GetPriceDynamic(PackagePriceDynamicRequest $parameters)"
[7]=>
string(111) "GetDetailedSearchResultItemResponse GetDetailedSearchResultItem(GetDetailedSearchResultItemRequest $parameters)"
}
|
что с этим делать, куда дальше? | |
|
|
|
|
125.7 Кб |
|
|
для: Bvz
(10.11.2016 в 14:04)
| | Если дать в адресной строке ссылку без ?wsdl в конце, должен быть показан пример запроса для SOAP 1 и SOAP 1.2.
Есть программка для составления SOAP-запросов. Называется SOAPUI 5.2.0. Очень помогает.
Если ошибка вкралась в запрос, скажет, в какой строке. Если сервер возвращает ошибку, можно посмотреть ее код и послать разработчику веб-сервиса.
Прикрепляю скриншот. Прога бесплатная. Очень рекомендую. | |
|
|
|
|
|
|
|
для: elenaki
(10.11.2016 в 15:41)
| |
Если дать в адресной строке ссылку без ?wsdl в конце, должен быть показан пример запроса для SOAP 1 и SOAP 1.2.
|
он выдает для C# и Visual Basic
ошибок пока нет, проблема понять, как реализовали его разработчики, что под капотом | |
|
|
|
|
|
|
|
для: Bvz
(10.11.2016 в 15:53)
| | И никакого XML?
SOAPUI сам составляет запрос и получает ответ. Слева показываются все доступные функции, справа в окошке из двух частей - запрос, который надо заполнить данными, и ответ сервера. Обычно общение с веб-сервисом ведется через XML, иногда через объекты классов, иногда в виде массива. Можно установить Visual Studio и посмотреть как работает запрос на VB. Но мне лично это не помогло. | |
|
|
|
|
|
|
|
для: elenaki
(10.11.2016 в 15:56)
| | кое-какие примеры есть
а что средствами php я не могу получить всю необходимую информацию имея доступ к wsdl | |
|
|
|
|
|
|
|
для: Bvz
(10.11.2016 в 16:10)
| | Можно попробовать библиотеку nusoap. Ее рекламируют как php toolkit для SOAP. | |
|
|
|
|
|
|
|
для: elenaki
(10.11.2016 в 16:45)
| | есть же встроенные инструменты php
сейчас начал разбираться с SOAPUI вроде начали некоторые запросы выполняться, теперь ломаю голову как это перенести на php | |
|
|
|
|
|
|
|
для: Bvz
(14.11.2016 в 16:05)
| | У меня было 9 разных компаний, с которыми надо было наладить веб-сервис. Большинство давало хоть какое-то руководство или примеры. Одна не дала вообще ничего, а еще одна работала только с VB, которого я не знаю и учить ради них не собиралась. Ничего, разобралась. Самое противное - это когда классы используют. ООП - это выше моего понимания. Но сделала и с классами. Самое простое - когда XML. Просто создаешь в php строку, содержащую в формате XML требуемые параметры и скармливаешь ее функции. Немного сложнее с массивами. Просто я массивы тоже не люблю. Но ответ удобнее читать, когда он в виде массива приходит. Поэтому порылась и нашла функцию, делающую массив из XML. Предлагаю попробовать взять за основу запрос, составленный SOAPUI, это чистый XML. Дать его как параметр функции и получить ответ. Если не пройдет, можно этот запрос переделать в массив, не забывая про типы данных в полях. Если и с массивом не прокатит, значит класс требуется. Объекты, свойства и все прелести ООП.
try {
$client = new SoapClient("url_end_point", array("exceptions"=>0,"trace" => 1));
$client->Your_function($b);
print_r ($client->__soapCall("Your_function", array($b)));
} catch (SoapFault $fault) {
trigger_error("Ошибка SOAP: (faultcode: {$fault->faultcode}, faultstring: {$fault->faultstring})", E_USER_ERROR);
}
/// array($b) - данные в виде массива
echo "REQUEST:\n" . $client->__getLastRequestHeaders() . "\n";
echo "REQUEST:\n" . $client->__getLastRequest() . "\n";
echo "RESPONSE:\n" . $client->__getLastResponseHeaders() . "\n";
echo "RESPONSE:\n" . $client->__getLastResponse() . "\n";
|
| |
|
|
|
|
|
|
|
для: elenaki
(14.11.2016 в 17:12)
| | по поводу параметров, есть простые типы данных, а есть сложные.
с простыми все понятно, а вот как сложные подставляются? | |
|
|
|
|
|
|
|
для: Bvz
(14.11.2016 в 19:15)
| | Сложные могут быть массивом, а могут и объектом. Описание данных должно присутствовать в описании функции и в самом wsdl.
пример описания сложного типа:
тип Address - сложный, он описан ниже, это массив из 5 элементов типа строка или объект с 5 свойствами.
тип personalData - тоже сложный, тоже есть описание, из чего он состоит.
это только небольшой кусок wsdl
<s:complexType name="ContrProposal">
<s:sequence>
<s:element minOccurs="0" name="address" type="s0:Address"/>
<s:element minOccurs="0" name="OfferCode" type="s:string"/>
<s:element minOccurs="0" name="contractingData" type="s0:personalData"/>
<s:element minOccurs="0" name="firstInstallment" type="s0:Currency"/>
<s:element minOccurs="0" name="gross" type="s0:Currency"/>
<s:element minOccurs="0" name="insuredData" type="s0:personalData"/>
<s:element minOccurs="0" name="validFrom" type="s:long"/>
<s:element minOccurs="0" name="validTo" type="s:long"/>
</s:sequence>
</s:complexType>
<s:complexType name="Address">
<s:sequence>
<s:element minOccurs="0" name="num" type="s:string"/>
<s:element minOccurs="0" name="region" type="s:string"/>
<s:element minOccurs="0" name="street" type="s:string"/>
<s:element minOccurs="0" name="town" type="s:string"/>
<s:element minOccurs="0" name="zip" type="s:string"/>
</s:sequence>
</s:complexType>
<s:complexType name="personalData">
<s:sequence>
<s:element minOccurs="0" name="address" type="s0:Address"/>
<s:element minOccurs="0" name="afm" type="s:string"/>
<s:element minOccurs="0" name="doy" type="s:string"/>
<s:element minOccurs="0" name="email" type="s:string"/>
<s:element minOccurs="0" name="phone" type="s:string"/>
<s:element minOccurs="0" name="phonemobile" type="s:string"/>
<s:element minOccurs="0" name="name" type="s:string"/>
<s:element minOccurs="0" name="surname" type="s:string"/>
<s:element minOccurs="0" name="parentname" type="s:string"/>
<s:element minOccurs="0" name="sex" type="s:string"/>
<s:element minOccurs="0" name="birthDate" type="s:long"/>
<s:element minOccurs="0" name="adt" type="s:string"/>
<s:element minOccurs="0" name="occupation" type="s:string"/>
</s:sequence>
</s:complexType>
|
| |
|
|
|
|
|
|
|
для: elenaki
(15.11.2016 в 10:23)
| | это все понятно, вопрос в том, как это барахло на php переложить | |
|
|
|
|
|
|
|
для: Bvz
(15.11.2016 в 11:58)
| | 1. Возьмем функцию PackageSearchOptionsRequest , найдем ее описание в wsdl
<xs:element name="PackageSearchOptionsRequest">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="Parameters" nillable="true" type="q1:PackageSearchOptionsParameters" xmlns:q1="http://pegast.com/pegasys/api"/>
</xs:sequence>
</xs:complexType>
</xs:element>
|
2. Функция принимает объект с именем Parameters и типом PackageSearchOptionsParameters.
Создадим объект с именем Parameters
3. Найдем в wsdl описание типа PackageSearchOptionsParameters.
<xs:complexType name="PackageSearchOptionsParameters">
<xs:sequence>
<xs:element minOccurs="0" name="DepartureLocationId" nillable="true" type="xs:int"/>
<xs:element minOccurs="0" name="DestinationCountryId" nillable="true" type="xs:int"/>
<xs:element minOccurs="0" name="Groups" type="q2:PackageSearchOptionGroups" xmlns:q2="http://pegast.com/pegasys/api"/>
<xs:element minOccurs="0" name="HotelIds" nillable="true" type="q3:ArrayOfint" xmlns:q3="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/>
<xs:element minOccurs="0" name="MarketIds" nillable="true" type="q4:ArrayOfint" xmlns:q4="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/>
<xs:element minOccurs="0" name="MaxOutgoingDate" nillable="true" type="xs:dateTime"/>
<xs:element minOccurs="0" name="MaxReturnDate" nillable="true" type="xs:dateTime"/>
<xs:element minOccurs="0" name="MinOutgoingDate" nillable="true" type="xs:dateTime"/>
<xs:element minOccurs="0" name="MinReturnDate" nillable="true" type="xs:dateTime"/>
<xs:element minOccurs="0" name="PackageId" nillable="true" type="xs:int"/>
<xs:element minOccurs="0" name="PackageTypeIds" nillable="true" type="q5:ArrayOfint" xmlns:q5="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/>
<xs:element minOccurs="0" name="ReturnHotelOptionsWithAttributes" type="xs:boolean"/>
<xs:element minOccurs="0" name="ReturnHotelOptionsWithMeals" type="xs:boolean"/>
<xs:element minOccurs="0" name="ReturnLocationId" nillable="true" type="xs:int"/>
<xs:element minOccurs="0" name="ReturnOptionsForAlternativeReturnLo cations" type="xs:boolean"/>
<xs:element minOccurs="0" name="ReturnPastDepartureDates" type="xs:boolean"/>
</xs:sequence>
</xs:complexType>
|
4. Начнем наполнять объект свойствами в соответствии с описанным типом
$req->Parameters->DepartureLocationId = 77; /// Из описания понятно, что это целое число, означающее код места отправления, допустим 77
$req->Parameters->DestinationCountryId = 30; //тут очевидно код страны прибытия, тоже целое число, допустим, 30
|
5. Третий параметр под именем Groups имеет сложный тип с именем PackageSearchOptionGroups. Найдем его описание в wsdl. Оно длинное, там числа 0,1,2,... Надо создать объект PackageSearchOptionGroups и дать на него ссылку в родительском объекте.
$req->Parameters->Groups = new PackageSearchOptionGroups(); /// ссылка на дочерний объект
$req->Parameters->Groups->PackageSearchOptionGroups = 0; // выбранное значение
|
Так идти по всем элементам. Потом полученный объект $req подставить в вызове SOAP.
Я бы выбрала для начала самую маленькую функцию, ту, которая требует меньше всего параметров. Или пусть много параметров, но все простого типа. Конечно, потом все эти параметры должны будут выбираться/заполняться через форму. И в объект/массив/строку XML входить в виде элементов массива $_POST. | |
|
|
|
|
|
|
|
для: elenaki
(15.11.2016 в 13:10)
| | спасибо, а ArrayOfint тоже объект или массив, как его обрабатывть? | |
|
|
|
|
|
|
|
|
для: elenaki
(15.11.2016 в 14:03)
| | а почему Parameters объект? | |
|
|
|
|
|
|
|
для: Bvz
(15.11.2016 в 15:02)
| | А он может быть и массив. | |
|
|
|
|
|
|
|
для: elenaki
(15.11.2016 в 15:07)
| | и как понять? | |
|
|
|
|
|
|
|
для: Bvz
(15.11.2016 в 15:12)
| | Когда у меня не было документации на веб-сервис, понимала только методом тыка. Шла от простого к сложному. Давала функции xml-строку в качестве параметра. Если не срабатывало - массив. Последний вариант - классы. Помогло то, что фирме, которая не дала документацию, сервис делала наша знакомая фирма. Они дали пример запроса. | |
|
|
|
|
|
|
|
для: elenaki
(15.11.2016 в 15:43)
| | ясно, спасибо ))) | |
|
|
|
|
|
|
|
для: Bvz
(15.11.2016 в 11:58)
| | Вот пример небольшой функции на php, которая строит SOAP-запрос в виде xml, вызывает soap-функцию и получает ответ сервера.
$client - ответ другой функции, которая подключает wsdl
$packages_arr - то, что возвращает эта функция, массив пакетов
function getPackages () {
global $client, $packages_arr;
$request = "<?xml version='1.0' encoding='ISO-8859-7'?>
<Request>
<Header>
<FunctionID>6</FunctionID>
<SessionHandle>".$_SESSION["session_handle"]."</SessionHandle>
</Header>
<Data>
<BRANCHCODEID>19</BRANCHCODEID>
<INCEPTION>".date("Ymd", mktime(0,0,0))."</INCEPTION>
</Data>
</Request>";
//echo $request; exit;
try {
$answer = $client->ServerCall($request);
} catch (SoapFault $fault) {
print "<hr><b style='color: red;'>faultcode: $fault->faultcode
faultstring: $fault->faultstring!</b><hr> ";
}
##### тут обработка ответа сервера answer и вывод результатов в удобном виде. #####
}
|
| |
|
|
|
|
|
|
|
для: elenaki
(15.11.2016 в 13:29)
| |
Fatal error: Class 'Parameters' not found
|
ArrayOfint - тоже как объект обрабатывать или это просто массив | |
|
|
|
|
|
|
|
для: Bvz
(15.11.2016 в 13:55)
| | Класс надо сначала описать. Если работаете с классами, то все - как объекты.
class Parameters {
public $DepartureLocationId; //int
public $DestinationCountryId; //int
public $Groups; // class of type PackageSearchOptionGroups
public $HotelIds; //ArrayOfint
public $MarketIds; //ArrayOfint
public $MaxOutgoingDate; //dateTime
public $MaxReturnDate; //dateTime
public $MinOutgoingDate; //dateTime
public $MinReturnDate; //dateTime
public $PackageId; //int
public $PackageTypeIds; //ArrayOfint
public $ReturnHotelOptionsWithAttributes; // boolean
public $ReturnHotelOptionsWithMeals; //boolean
public $ReturnLocationId; //int
public $ReturnOptionsForAlternativeReturnLo; //boolean
public $ReturnPastDepartureDates; //boolean
}
|
Но в этом классе есть дочерний класс (Groups), значит, надо и его описать сначала. | |
|
|
|
|
|
|
|
для: Bvz
(10.11.2016 в 15:53)
| | Ошибок нет, потому что запроса нет. | |
|
|
|
|
|
|
|
для: elenaki
(10.11.2016 в 16:07)
| | а почему нет запроса? | |
|
|
|
|
|
|
|
для: Bvz
(15.11.2016 в 12:38)
| | А где запрос? Прогу запустили? Ссылку ей дали на wsdl? Она должна выдать список функций и к каждой функции построить пустой запрос в виде xml. Его надо заполнить данными и попробовать запустить. Потом анализировать ответ сервера. Если нет запроса, то и ответа нет на него и ошибок нет. | |
|
|
|
|
|
|
|
для: elenaki
(15.11.2016 в 13:16)
| |
s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<GetDetailedSearchResultItemResponse xmlns="http://pegast.com/pegasys/api">
<Error>None</Error>
<Result xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<IsSucceeded>false</IsSucceeded>
<DetailedSearchResultItem>
<AdditionalServices/>
<CurrencyId>0</CurrencyId>
<EndDate>0001-01-01T00:00:00</EndDate>
<ExcursionServices/>
<FlightServices/>
<HotelEarlyBookingReductionsMinExpir ationDate i:nil="true" xmlns:a="http://schemas.datacontract.org/2004/07/System"/>
<HotelServices/>
<HotelSpoMinExpirationDate i:nil="true" xmlns:a="http://schemas.datacontract.org/2004/07/System"/>
<HotelSupplements/>
<InsuranceServices/>
<PackageId>0</PackageId>
<PackageSpoId i:nil="true"/>
<PaymentCurrencyId i:nil="true"/>
<PaymentCurrencyPrice i:nil="true"/>
<Price>0</Price>
<StartDate>0001-01-01T00:00:00</StartDate>
<TotalAgencyBonus i:nil="true"/>
<TotalAgencyEmployeeBonus i:nil="true"/>
<TotalAgencyFee i:nil="true"/>
<TransferServices/>
</DetailedSearchResultItem>
<Error>InvalidParameters</Error>
<PaymentCurrencyExchangeRateNotFound>false</PaymentCurrencyExchangeRateNotFound>
<ReferenceDescritpion>
<AdditionalServices/>
<Aircrafts/>
<Airlines/>
<Airports/>
<BonusTypes/>
<Countries/>
<Currencies/>
<Excursions/>
<FlightClasses/>
<FlightLegs/>
<FlightSegments/>
<FlightTypes/>
<HotelAttributes/>
<HotelCategories/>
<HotelSupplementTypes/>
<Hotels/>
<InsuranceRiskFareModificatorOptionT ypes/>
<InsuranceRiskFareModificatorTypes/>
<InsuranceRiskTypes/>
<InsuranceTourCancellationRiskOption Types/>
<Insurances/>
<LocationAreas/>
<Locations/>
<Meals/>
<Package i:nil="true"/>
<PackageSpo i:nil="true"/>
<PackageSpoType i:nil="true"/>
<PackageType i:nil="true"/>
<Regions/>
<RoomCategories/>
<TransferTypes/>
</ReferenceDescritpion>
</Result>
</GetDetailedSearchResultItemResponse>
</s:Body>
</s:Envelope>
|
| |
|
|
|
|
|
|
|
для: Bvz
(10.11.2016 в 14:04)
| | Это и есть методы, которыми можно получить необходимые данные. К центробанку запрос? | |
|
|
|
|
|
|
|
для: confirm
(10.11.2016 в 16:02)
| | нет туроператор | |
|
|
|
|
|
|
|
для: Bvz
(10.11.2016 в 16:09)
| | Если неохота качать прогу, покажите ссылку на wsdl, я закину ее в UI и выложу пример запроса. | |
|
|
|
|
127.4 Кб |
|
|
для: elenaki
(10.11.2016 в 16:11)
| | они дали доступ только по IP боюсь вы не сможете открыть, прогу скачал, надо разобраться с ее работой, могу вот такой файл приложить ) от открывается при открытии ссылки в браузере | |
|
|
|