Soap requests in php

Использование SOAP в PHP

Рассмотрим пример, как использовать SOAP в PHP. Использование SOAP в PHP может показаться трудным, и неудобным, однако немного разобравшись, вы сразу же поймете что это не так. Если у вас возникла необходимость воспользоваться протоколом SOAP, то данный пример вам будет в помощь.

Перед использованием классов SOAP библиотека должна быть предварительно подключена в PHP. Как установить PHP Soap на сервер CentOS Linux ранее уже был пост об этом. Приступим непосредственно к примеру.

В нашем примере есть некий удаленный сервер SOAP, к которому мы будем обращаться с нашего PHP — скрипта. Нам необходимо заполучить какие-либо данные, со стороны сервера SOAP. Традиционно SOAP предназначался для реализации RPC (удаленный вызов процедур). Это говорит о том, что чтобы получить какие-то данные, на другой стороне мы будем иметь дело с чем-то вроде функции, к которой будем обращаться по имени, отправляя предустановленные параметры. В качестве успешного выполнения мы будем получать данные в виде объекта. С объектами мы так же можем привычно работать в PHP, что весьма удобно.

GetOrderInfo( array('OrderCode' => '20001827') ); if ($result->return)< // обращаемся к данным в виде объектов echo 'Product: ' . $result->return->cmp->ProdName . '
' . 'Amount' . $result->return->cmp->Amount . 'Price' . $result->return->cmp->Price; > else echo "Не удалось получить данные!"; > else echo "Включите поддержку SOAP в PHP!"; ?>

Как видно из примера ничего космического. Сперва мы подключаемся к серверу, для этого при создании объекта класса SoapClient мы передаем три параметра: URL сервера, логин и пароль. Далее обращаемся к функции, в нашем случае она называется GetOrderInfo, именоваться она может как угодно, и принимать различные параметры. Находиться данная функция на стороне SOAP сервера. В примере мы передаем на сервер код, по которому нам должен вернуться объект с данными. Далее мы просто выводим эти данные. Этот пример прост, и он больше для демонстрации обмена данными между PHP-скриптом и SOAP сервером. В действительности объемы отправляемых параметром, и принимаемых данных может быть значительно больше, но это уже дело архитектурной сложности системы, и у каждого она своя.

Читайте также:  Центрировать блок div css

VK FB TW Whatsapp Telegram Email

Источник

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.

Читайте также:  Draw points opencv python

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.

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.

Читайте также:  Forum showthread php данный

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 ;

// 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 );
>
>
>
>

Источник

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