New soapclient пример php

SOAP

PROBLEM (with SOAP extension under PHP5) of transferring object, that contains objects or array of objects. Nested object would not transfer.

SOLUTION:
This class was developed by trial and error by me. So this 23 lines of code for most developers writing under PHP5 solves fate of using SOAP extension.

/*
According to specific of organization process of SOAP class in PHP5, we must wrap up complex objects in SoapVar class. Otherwise objects would not be encoded properly and could not be loaded on remote SOAP handler.

Function «getAsSoap» call for encoding object for transmission. After encoding it can be properly transmitted.
*/
abstract class SOAPable public function getAsSOAP () foreach( $this as $key =>& $value ) $this -> prepareSOAPrecursive ( $this -> $key );
>
return $this ;
>

private function prepareSOAPrecursive (& $element ) if( is_array ( $element )) foreach( $element as $key =>& $val ) $this -> prepareSOAPrecursive ( $val );
>
$element =new SoapVar ( $element , SOAP_ENC_ARRAY );
>elseif( is_object ( $element )) if( $element instanceof SOAPable ) $element -> getAsSOAP ();
>
$element =new SoapVar ( $element , SOAP_ENC_OBJECT );
>
>
>

class PersonList extends SOAPable protected $ArrayOfPerson ; // variable MUST be protected or public!
>

class Person extends SOAPable //any data
>

$client =new SoapClient ( «test.wsdl» , array( ‘soap_version’ => SOAP_1_2 , ‘trace’ => 1 , ‘classmap’ => array( ‘Person’ => «Person» , ‘PersonList’ => «PersonList» ) ));

$PersonList =new PersonList ;

$client -> someMethod ( $PersonList );

?>

So every class, which will transfer via SOAP, must be extends from class SOAPable.
As you can see, in code above, function prepareSOAPrecursive search another nested objects in parent object or in arrays, and if does it, tries call function getAsSOAP() for preparation of nested objects, after that simply wrap up via SoapVar class.

So in code before transmitting simply call $obj->getAsSOAP()

If you are having an issue where SOAP cannot find the functions that are actually there if you view the wsdl file, it’s because PHP is caching the wsdl file (for a day at a time). To turn this off, have this line on every script that uses SOAP: ini_set(«soap.wsdl_cache_enabled», «0»); to disable the caching feature.

Читайте также:  How to open stream python

Juste a note to avoid wasting time on php-soap protocol and format support.

Until php 5.2.9 (at least) the soap extension is only capable of understanding wsdl 1.0 and 1.1 format.

The wsdl 2.0, a W3C recommendation since june 2007, ISN’T supported in php soap extension.
(the soap/php_sdl.c source code don’t handle wsdl2.0 format)

The wsdl 2.0 is juste the 1.2 version renamed because it has substantial differences from WSDL 1.1.

The differences between the two format may not be invisible if you don’t care a lot.

The typical error message if you provide a wsdl 2.0 format file :
PHP Fatal error: SOAP-ERROR: Parsing WSDL: Couldn’t find in ‘wsdl/example.wsdl’ in /path/client.php on line 9

Was calling an asmx method like $success=$x->AuthenticateUser($userName,$password) and this was returning me an error.

However i changed it and added the userName and password in an array and its now KAWA.

If anyone is trying to use this for accessing Sabre’s web services, it won’t work. Sabre checks the request header «Content-Type» to see if it is «text/xml» . If it is not text/xml then it sends an error back.

You will need to create a socket connection and use that to send the request over.

Here is an example of a php client talking to a asmx server:

// Prepare SoapHeader parameters
$sh_param = array(
‘Username’ => ‘username’ ,
‘Password’ => ‘password’ );
$headers = new SoapHeader ( ‘http://soapserver.example.com/webservices’ , ‘UserCredentials’ , $sh_param );

// Prepare Soap Client
$soapClient -> __setSoapHeaders (array( $headers ));

// Setup the RemoteFunction parameters
$ap_param = array(
‘amount’ => $irow [ ‘total_price’ ]);

// Call RemoteFunction ()
$error = 0 ;
try <
$info = $soapClient -> __call ( «RemoteFunction» , array( $ap_param ));
> catch ( SoapFault $fault ) <
$error = 1 ;
print( »
alert(‘Sorry, blah returned the following ERROR: » . $fault -> faultcode . «-» . $fault -> faultstring . «. We will now take you back to our home page.’);
window.location = ‘main.php’;
» );
>

if ( $error == 0 ) <
$auth_num = $info -> RemoteFunctionResult ;

Читайте также:  Как обновить request python

// Setup the OtherRemoteFunction() parameters
$at_param = array(
‘amount’ => $irow [ ‘total_price’ ],
‘description’ => $description );

// Call OtherRemoteFunction()
$trans = $soapClient -> __call ( «OtherRemoteFunction» , array( $at_param ));
$trans_result = $trans -> OtherRemoteFunctionResult ;
.
> else <
// Record the transaction error in the database

// Kill the link to Soap
unset( $soapClient );
>
>
>
>

Источник

SoapClient::SoapClient

Конструктор создает объект SoapClient в WSDL или не-WSDL режиме.

Список параметров

URI файла WSDL или NULL , если работа происходит в режиме не-WSDL.

Замечание:

Во время разработки кэширование WSDL можно отключить, используя настройку soap.wsdl_cache_ttl в php.ini , иначе изменения, сделанные в WSDL файле, не будут иметь эффекта до тех пор, пока не истечет время, указанное в soap.wsdl_cache_ttl.

Массив настроек. Если работа происходит в режиме WSDL, то этот параметр необязательный. Если в не-WSDL режиме, то должны быть установлены опции location и uri, где location — URL сервера SOAP, к которому отправляется запрос, и uri — целевое пространство имен SOAP-сервиса.

Опции style и use используются только в не-WSDL режиме. В WSDL режиме они берутся из WSDL файла.

Опция soap_version должна быть равна либо SOAP_1_1 либо SOAP_1_2 , чтобы использовать соответственно SOAP 1.1 или 1.2. Если параметр пропущен, то используется 1.1 . будет ли использоваться SOAP-клиент версии 1.1 (по умолчанию) или 1.2.

Для HTTP аутентификации могут быть использованы опции login и password для получения полномочий. Для реализации HTTP соединения через proxy-сервер используются настройки proxy_host, proxy_port, proxy_login и proxy_password. Для HTTPS сертификата аутентификации клиента используются опции local_cert и passphrase. Аутентификация может быть передана через authentication. Метод аутентификации может быть SOAP_AUTHENTICATION_BASIC (по умолчанию) или SOAP_AUTHENTICATION_DIGEST .

Опция compression позволяет сжимать запросы и ответы HTTP SOAP.

Опция encoding определяет внутреннюю кодировку. Опция не меняет кодировку SOAP-запросов (она всегда utf-8), но преобразует строки в нее.

Опция trace включает отслеживание запроса и в случае ошибки можно получить обратную трассировку. По умолчанию имеет значение FALSE .

Опция classmap может использоваться для перевода некоторых WSDL-типов в PHP классы. Опция должна представлять собой массив, в качестве ключей которого указаны WSDL-типы, а в качестве значений — имена PHP классов.

Читайте также:  Off the hook css

Опция exceptions принимает булевые значения и определяет будут ли SOAP-ошибки бросать исключения типа SoapFault.

Опция connection_timeout определяет тайм-аут в секундах для соединения с SOAP-сервисом. Опция не устанавливает тайм-аут для сервисов с медленными ответами. Для ограничения времени ожидания вызовов используется default_socket_timeout.

Опция typemap является массивом сопоставления типов. Массив сопоставления типов — это массив с ключами type_name, type_ns (URI пространства имен), from_xml (функция обратного вызова принимает один строковый параметр) и to_xml (функция обратного вызова принимает объект в качестве параметра).

Опция cache_wsdl принимает одно из значений: WSDL_CACHE_NONE , WSDL_CACHE_DISK , WSDL_CACHE_MEMORY или WSDL_CACHE_BOTH .

Опция user_agent определяет строку для использования в User-Agent заголовке.

Опция stream_context — это resource для context.

Опция features является битовой маской SOAP_SINGLE_ELEMENT_ARRAYS , SOAP_USE_XSI_ARRAY_TYPE , SOAP_WAIT_ONE_WAY_CALLS .

Опция keep_alive принимает булево значение, определяющее какой заголовок отправлять: Connection: Keep-Alive или Connection: close.

Опция ssl_method должна быть равной SOAP_SSL_METHOD_TLS , SOAP_SSL_METHOD_SSLv2 , SOAP_SSL_METHOD_SSLv3 или SOAP_SSL_METHOD_SSLv23 .

Ошибки

SoapClient::SoapClient() будет бросать ошибку E_ERROR , если опции location и uri не передаются в не-WSDL режиме.

Исключение SoapFault будет брошено, если wsdl URI не может быть загружена.

Список изменений

Версия Описание
5.5.0 Новая опция ssl_method.
5.4.0 Новая опция keep_alive.

Примеры

Пример #1 Пример использования SoapClient::SoapClient()

$client = new SoapClient ( «some.wsdl» );

$client = new SoapClient ( «some.wsdl» , array( ‘soap_version’ => SOAP_1_2 ));

$client = new SoapClient ( «some.wsdl» , array( ‘login’ => «some_name» ,
‘password’ => «some_password» ));

$client = new SoapClient ( «some.wsdl» , array( ‘proxy_host’ => «localhost» ,
‘proxy_port’ => 8080 ));

$client = new SoapClient ( «some.wsdl» , array( ‘proxy_host’ => «localhost» ,
‘proxy_port’ => 8080 ,
‘proxy_login’ => «some_name» ,
‘proxy_password’ => «some_password» ));

$client = new SoapClient ( «some.wsdl» , array( ‘local_cert’ => «cert_key.pem» ));

$client = new SoapClient ( null , array( ‘location’ => «http://localhost/soap.php» ,
‘uri’ => «http://test-uri/» ));

$client = new SoapClient ( null , array( ‘location’ => «http://localhost/soap.php» ,
‘uri’ => «http://test-uri/» ,
‘style’ => SOAP_DOCUMENT ,
‘use’ => SOAP_LITERAL ));

$client = new SoapClient ( «some.wsdl» ,
array( ‘compression’ => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP ));

$server = new SoapClient ( «some.wsdl» , array( ‘encoding’ => ‘ISO-8859-1’ ));

class MyBook public $title ;
public $author ;
>

$server = new SoapClient ( «books.wsdl» , array( ‘classmap’ => array( ‘book’ => «MyBook» )));

Источник

Оцените статью