Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: как вытянуть необходимые данные из wsdl?
 
 автор: Bvz   (10.11.2016 в 14:04)   письмо автору
 
 

собственно никогда не работал с 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)"
}


что с этим делать, куда дальше?

  Ответить  
 
 автор: elenaki   (10.11.2016 в 15:41)   письмо автору
125.7 Кб
 
   для: Bvz   (10.11.2016 в 14:04)
 

Если дать в адресной строке ссылку без ?wsdl в конце, должен быть показан пример запроса для SOAP 1 и SOAP 1.2.

Есть программка для составления SOAP-запросов. Называется SOAPUI 5.2.0. Очень помогает.

Если ошибка вкралась в запрос, скажет, в какой строке. Если сервер возвращает ошибку, можно посмотреть ее код и послать разработчику веб-сервиса.

Прикрепляю скриншот. Прога бесплатная. Очень рекомендую.

  Ответить  
 
 автор: Bvz   (10.11.2016 в 15:53)   письмо автору
 
   для: elenaki   (10.11.2016 в 15:41)
 

    

Если дать в адресной строке ссылку без ?wsdl в конце, должен быть показан пример запроса для SOAP 1 и SOAP 1.2.

он выдает для C# и Visual Basic

ошибок пока нет, проблема понять, как реализовали его разработчики, что под капотом

  Ответить  
 
 автор: elenaki   (10.11.2016 в 15:56)   письмо автору
 
   для: Bvz   (10.11.2016 в 15:53)
 

И никакого XML?

SOAPUI сам составляет запрос и получает ответ. Слева показываются все доступные функции, справа в окошке из двух частей - запрос, который надо заполнить данными, и ответ сервера. Обычно общение с веб-сервисом ведется через XML, иногда через объекты классов, иногда в виде массива. Можно установить Visual Studio и посмотреть как работает запрос на VB. Но мне лично это не помогло.

  Ответить  
 
 автор: Bvz   (10.11.2016 в 16:10)   письмо автору
 
   для: elenaki   (10.11.2016 в 15:56)
 

кое-какие примеры есть
а что средствами php я не могу получить всю необходимую информацию имея доступ к wsdl

  Ответить  
 
 автор: elenaki   (10.11.2016 в 16:45)   письмо автору
 
   для: Bvz   (10.11.2016 в 16:10)
 

Можно попробовать библиотеку nusoap. Ее рекламируют как php toolkit для SOAP.

  Ответить  
 
 автор: Bvz   (14.11.2016 в 16:05)   письмо автору
 
   для: elenaki   (10.11.2016 в 16:45)
 

есть же встроенные инструменты php
сейчас начал разбираться с SOAPUI вроде начали некоторые запросы выполняться, теперь ломаю голову как это перенести на php

  Ответить  
 
 автор: elenaki   (14.11.2016 в 17:12)   письмо автору
 
   для: 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"; 
  

  Ответить  
 
 автор: Bvz   (14.11.2016 в 19:15)   письмо автору
 
   для: elenaki   (14.11.2016 в 17:12)
 

по поводу параметров, есть простые типы данных, а есть сложные.
с простыми все понятно, а вот как сложные подставляются?

  Ответить  
 
 автор: elenaki   (15.11.2016 в 10:23)   письмо автору
 
   для: 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>

  Ответить  
 
 автор: Bvz   (15.11.2016 в 11:58)   письмо автору
 
   для: elenaki   (15.11.2016 в 10:23)
 

это все понятно, вопрос в том, как это барахло на php переложить

  Ответить  
 
 автор: elenaki   (15.11.2016 в 13:10)   письмо автору
 
   для: 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


$req = new 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.

  Ответить  
 
 автор: Bvz   (15.11.2016 в 13:37)   письмо автору
 
   для: elenaki   (15.11.2016 в 13:10)
 

спасибо, а ArrayOfint тоже объект или массив, как его обрабатывть?

  Ответить  
 
 автор: elenaki   (15.11.2016 в 14:03)   письмо автору
 
   для: Bvz   (15.11.2016 в 13:37)
 

Это массив целых чисел.
Описание здесь https://msdn.microsoft.com/en-us/library/ff690589(v=sql.105).aspx

  Ответить  
 
 автор: Bvz   (15.11.2016 в 15:02)   письмо автору
 
   для: elenaki   (15.11.2016 в 14:03)
 

а почему Parameters объект?

  Ответить  
 
 автор: elenaki   (15.11.2016 в 15:07)   письмо автору
 
   для: Bvz   (15.11.2016 в 15:02)
 

А он может быть и массив.

  Ответить  
 
 автор: Bvz   (15.11.2016 в 15:12)   письмо автору
 
   для: elenaki   (15.11.2016 в 15:07)
 

и как понять?

  Ответить  
 
 автор: elenaki   (15.11.2016 в 15:43)   письмо автору
 
   для: Bvz   (15.11.2016 в 15:12)
 

Когда у меня не было документации на веб-сервис, понимала только методом тыка. Шла от простого к сложному. Давала функции xml-строку в качестве параметра. Если не срабатывало - массив. Последний вариант - классы. Помогло то, что фирме, которая не дала документацию, сервис делала наша знакомая фирма. Они дали пример запроса.

  Ответить  
 
 автор: Bvz   (15.11.2016 в 15:50)   письмо автору
 
   для: elenaki   (15.11.2016 в 15:43)
 

ясно, спасибо )))

  Ответить  
 
 автор: elenaki   (15.11.2016 в 13:29)   письмо автору
 
   для: 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 и вывод результатов в удобном виде.    #####
}

  Ответить  
 
 автор: Bvz   (15.11.2016 в 13:55)   письмо автору
 
   для: elenaki   (15.11.2016 в 13:29)
 

Fatal error: Class 'Parameters' not found


ArrayOfint - тоже как объект обрабатывать или это просто массив

  Ответить  
 
 автор: elenaki   (15.11.2016 в 14:05)   письмо автору
 
   для: 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), значит, надо и его описать сначала.

  Ответить  
 
 автор: elenaki   (10.11.2016 в 16:07)   письмо автору
 
   для: Bvz   (10.11.2016 в 15:53)
 

Ошибок нет, потому что запроса нет.

  Ответить  
 
 автор: Bvz   (15.11.2016 в 12:38)   письмо автору
 
   для: elenaki   (10.11.2016 в 16:07)
 

а почему нет запроса?

  Ответить  
 
 автор: elenaki   (15.11.2016 в 13:16)   письмо автору
 
   для: Bvz   (15.11.2016 в 12:38)
 

А где запрос? Прогу запустили? Ссылку ей дали на wsdl? Она должна выдать список функций и к каждой функции построить пустой запрос в виде xml. Его надо заполнить данными и попробовать запустить. Потом анализировать ответ сервера. Если нет запроса, то и ответа нет на него и ошибок нет.

  Ответить  
 
 автор: Bvz   (15.11.2016 в 13:43)   письмо автору
 
   для: 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>

  Ответить  
 
 автор: confirm   (10.11.2016 в 16:02)   письмо автору
 
   для: Bvz   (10.11.2016 в 14:04)
 

Это и есть методы, которыми можно получить необходимые данные. К центробанку запрос?

  Ответить  
 
 автор: Bvz   (10.11.2016 в 16:09)   письмо автору
 
   для: confirm   (10.11.2016 в 16:02)
 

нет туроператор

  Ответить  
 
 автор: elenaki   (10.11.2016 в 16:11)   письмо автору
 
   для: Bvz   (10.11.2016 в 16:09)
 

Если неохота качать прогу, покажите ссылку на wsdl, я закину ее в UI и выложу пример запроса.

  Ответить  
 
 автор: Bvz   (10.11.2016 в 16:20)   письмо автору
127.4 Кб
 
   для: elenaki   (10.11.2016 в 16:11)
 

они дали доступ только по IP боюсь вы не сможете открыть, прогу скачал, надо разобраться с ее работой, могу вот такой файл приложить ) от открывается при открытии ссылки в браузере

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования