Soapclient php примеры. Все шаги, необходимые для подключения к веб-службе (пример WSDL и пример SOAP)

In this example we will see an example of a SOAP client communicating with a server. SOAP is one of many web service protocol definition. A web service is a technology that uses a protocol (SOAP in this example) for exchanging data between applications over the network.

If we are developing a client for consuming a web service, we have to look at the protocol that the service is using. This example is for looking at the resources provided by PHP for developing a client for a web service implementing the SOAP protocol.

For this example, we will use:

  • Ubuntu (14.04) as Operating System.
  • Apache HTTP server (2.4.7).
  • PHP (5.5.9).

1. Preparing the environment

1.1. Installation

Below, commands to install Apache and PHP are shown:

Sudo apt-get update sudo apt-get install apache2 php5 libapache2-mod-php5 sudo service apache2 restart

1.2. PHP configuration

Even if it’s not necessary, is recommendable to disable the SOAP WSDL cache for development environments. In /etc/php5/apache2/php.ini file, set the soap.wsdl_cache_enabled directive to 0:

php.ini

Soap.wsdl_cache_enabled=0

Don’t forget to restart Apache after doing any change.

Note: if you want to use Windows, installing XAMPP is the fastest and easiest way to install a complete web server that meets the prerequisites.

2. What is SOAP?

SOAP (Simple Object Access Protocol) is a standard protocol that defines how two different objects in different processes can communicate each other, through data exchange in XML format. Is one of the widest protocols used in web services.

In other words, this protocol allows to call method of objects that are defined in remote machines.

3. PHP example of SOAP clients

The server offering their SOAP services can define them in two different ways:

  • With WSDL (Web Services Definition Language)
  • Without WSDL

From the client point of view, there are very few differences, but let’s see how to proceed for each one.

We will consider the following scenario, which is quite typical: a web service that inserts and reads from a database (simulated with a plain text file), for which we will develop a client.

Is responsibility of the server offering the service to let know the protocol used, as same as the available method definitions, in order to let the clients know how to deal with the service.

Even if this tutorial is about the client itself, we will see also the server side, in order to test that the client is actually working.

3.1. Working directory structure

For this example, we will use the following structure:

Php_soapclient_example/ ├── simple_soap_client_class.php ├── simple_soap_server_class.php ├── handle_soap_request.php ├── no_wsdl │ └── server_endpoint.php └── wsdl ├── server_endpoint.php └── simple_service_definition.wsdl

Where the root directory, php_soapclient_example , will be in the web server’s root directory, which is /var/www/html/ by default.

Briefly explained each file:

  • simple_soap_client_class.php is the class defined for the SOAP client methods.
  • simple_soap_server_class.php is the class defined for the SOAP server methods.
  • handle_soap_request.php is for instantiate and use the SimpleSoapClient class defined in simple_soap_client_class.php .
  • In the directories wsdl and no_wsdl , the service defined in simple_soap_server_class.php is offered, in the way it accords to each of the modes. We won’t go into details for these, since it is not the purpose of this example. The only thing we have to know is that in one of the directories there is a service offered in WSDL mode, and that in the other, in no WSDL mode; they are two independent web services that use the code defined in simple_soap_server_class.php .

Note: the WSDL mode needs a .wsdl file, where the web service is defined. We are not going to see it in this example, since the aim is not to see how to build a WSDL definition file, but it’s also available to download in the last section of the example.

3.2. The server

As said, our server will read and write data into a text file. Let’s see it:

simple_soap_server_class.php

", FILE_APPEND); if ($writtenBytes) { $response = "$writtenBytes bytes have been inserted."; } else { $response = "Error inserted data."; } return $response; } /** * Reads data. Invoked remotely from SOAP client. * * @return Data of file. */ public function readData() { $contents = file_get_contents(self::FILENAME); return $contents; } }

So simple, about reading and writing into a text file.

Note the functions this server implements, in lines 16 and 33. This functions will be those invoked by the client.

3.3. The client

As we said above, depending of the mode (WSDL or not WSDL), the client has to handle the connection in a different way but, once stablished, the procedure is the same. So, let’s code a class that works for both modes, handling the SoapClient class instantiation accordingly to the mode:

simple_soap_client_class.php

initializeClient($soapMode, $serverLocation); } /** * Instantiates the SoapClient, depending on the specified mode. * * For WSDL, it just has to be instantiated with the location of the service, which actually has to be the * .wsdl location. * * For non-WSDL, the first parameter of the constructor has to be null; and the second, an array specifying * both location and URI (which can be the same, the important parameter is the location). */ protected function initializeClient($soapMode, $serverLocation) { switch ($soapMode) { case self::MODE_WSDL: $this->client = new SoapClient($serverLocation); break; case self::MODE_NO_WSDL: $options = array("location" => $serverLocation, "uri" => $serverLocation); $this->client = new SoapClient(NULL, $options); break; default: throw new Exception("Error: invalid SOAP mode provided."); break; } } /** * Inserts data remotely into the SOAP service. * * @param $data Data to insert remotely. * @return Response from remote service. */ public function insertData($data) { $response = $this->client->insertData($data); return $response; } /** * Reads data from SOAP service. * * @return Data received from remote service. */ public function readData() { return $this->client->readData(); } }

The lines 35 and 45 instantiate the SoapClient class, depending on the $mode received. This is how it works for each mode:

  • For WSDL mode, we have just to pass the server location to the constructor. For this mode, the location must be the WSDL definition file (.wsdl), not a PHP file .
  • For non WSDL mode, the first parameter has to be null (because we are not accessing a WSDL definition). So, the location must be defined in a different way, providing an array with "location" and "uri" elements, with the server location as values. In this case, the location must be the PHP file handling the web service .

After the instantiation, the communication with the service is pretty simple. We have just to call the methods that we saw defined in SimpleSoapServer class, in simple_soap_client_class.php , through the SoapClient class instance. As we said before, we are calling methods that are defined in other place. What PHP SoapClient does, is to provide us those methods defined by the web service, and, when we call them, it will execute them in the server through the SOAP protocol that it has already implemented, with no needing to care about how it works. Seems magic, doesn’t it?

If you don’t believe it, let’s see a script to use this client.

3.4. Using the client

The following script allows us to use the client to communicate with the service, through GET parameters. These are the parameters available:

  • "mode" , to specify the mode (WSDL or non WSDL).
  • "action" , to specify the action to perform. Available values are "insert" and "read" .
  • "value" , to specify the value to insert, only necessary when the action is "insert" .

handle_soap_request.php

getMessage()); } return $soapClient; } // Flow starts here. checkGETParametersOrDie(["mode", "action"]); $mode = $_GET["mode"]; $action = $_GET["action"]; $soapClient = instantiateSoapClient($mode); switch($action) { case ACTION_INSERT: checkGETParametersOrDie(); $value = $_GET; try { $response = $soapClient->insertData($value); echo "Response from SOAP service: $response
"; } catch (Exception $exception) { die("Error inserting into SOAP service: " . $exception->getMessage()); } break; case ACTION_READ: try { $data = $soapClient->readData(); echo "Received data from SOAP service:
"; echo $data; } catch (Exception $exception) { die("Error reading from SOAP service: " . $exception->getMessage()); } break; default: die("Invalid "action" specified."); break; }

If we enter in the browser http://127.0.0.1/php_soapclient_example/handle_soap_request.php?mode=no_wsdl&action=insert&value=testing_no_wsdl , the service will create a no_wsdl/data.txt file (if not exists already), writing the provided value "testing_no_wsdl" , and the following will be printed:

Response from SOAP service: 19 bytes have been inserted.

(The 4 bytes extra correspond to additional
characters inserted into the file).

The service offers a method to reading all the data, so, if we enter in the browser http://127.0.0.1/php_soapclient_example/handle_soap_request.php?mode=no_wsdl&action=read , the following will be printed:

Received data from SOAP service:
testing_no_wsdl

We can check it also for WSDL mode, setting mode=wsdl in the parameters.

4. Considerations

As said in section 3, when we are developing a web service client (no matter if SOAP, REST, etc.), the service provider has to provide also documentation about the available methods; we need to know the definition of these: which parameters is expecting, af if it returns something. Because of that, the most usual way to develop a SOAP web service is using WSDL files, to provide documentation of the available methods. In any case, the SoapClient has a method to get the available methods, for debugging purposes, named __getFunctions() . So, we could see the offered methods by the service with the following:

Var_dump($soapClient->__getFunctions())

Assuming that $soapClient has been instanced properly.

Also note that, if the service does not offer an encrypted connection, the communication between the client and the server will be made in plain text. So, if we have to develop a client that has to deal with sensible information, we should ensure that the communication with the server can be considered safe.

5. Summary

We have seen how to develop a client for a SOAP web service using PHP’s SoapClient class. The server may offer the service using WSDL, or not, something to take into account when we are instantiating the SoapClient class. Then, to use the methods provided by the service, we just have to call those methods in SoapClient instance, as they were ours.

(9)

Я привык писать PHP-код, но не часто использую объектно-ориентированное кодирование. Теперь мне нужно взаимодействовать с SOAP (как клиент), и я не могу правильно получить синтаксис. У меня есть файл WSDL, который позволяет мне правильно настроить новое соединение с использованием класса SoapClient. Тем не менее, я не могу сделать правильный звонок и вернуть данные. Мне нужно отправить следующие (упрощенные) данные:

  • Контактный идентификатор
  • Контактное лицо
  • Общее описание
  • Количество

В документе WSDL есть две функции, но мне нужен только один («FirstFunction» ниже). Вот сценарий, который я запускаю, чтобы получить информацию о доступных функциях и типах:

$client = new SoapClient("http://example.com/webservices?wsdl"); var_dump($client->__getFunctions()); var_dump($client->__getTypes());

И вот результат, который он генерирует:

Array( => "FirstFunction Function1(FirstFunction $parameters)", => "SecondFunction Function2(SecondFunction $parameters)",); array( => struct Contact { id id; name name; } => string "string description" => string "int amount" }

Скажем, я хочу позвонить в FirstFunction с данными:

  • ID контакта: 100
  • Контактное лицо: John
  • Общее описание: Баррель нефти
  • Количество: 500

Какой будет правильный синтаксис? Я пробовал всевозможные варианты, но кажется, что мыльная структура довольно гибкая, поэтому есть очень много способов сделать это. Не удалось понять это из руководства...

ОБНОВЛЕНИЕ 1: опробованный образец из MMK:

$client = new SoapClient("http://example.com/webservices?wsdl"); $params = array("id" => 100, "name" => "John", "description" => "Barrel of Oil", "amount" => 500,); $response = $client->__soapCall("Function1", array($params));

Но я получаю этот ответ: у Object has no "Contact" property . Как вы можете видеть на выходе getTypes() , существует struct называемая Contact , поэтому, я думаю, мне почему-то нужно уточнить, что мои параметры включают данные Contact, но вопрос в следующем: как?

ОБНОВЛЕНИЕ 2: Я также пробовал эти структуры, такую ​​же ошибку.

$params = array(array("id" => 100, "name" => "John",), "Barrel of Oil", 500,);

Так же как:

$params = array("Contact" => array("id" => 100, "name" => "John",), "description" => "Barrel of Oil", "amount" => 500,);

Ошибка в обоих случаях: объект не имеет свойства «Контакт»

Answers

Код.

Это то, что вам нужно сделать на стороне PHP :

(Протестировано и работает)

id = $id; $this->name = $name; } } /* Initialize webservice with your WSDL */ $client = new SoapClient("http://localhost:10139/Service1.asmx?wsdl"); /* Fill your Contact Object */ $contact = new Contact(100, "John"); /* Set your parameters for the request */ $params = array("Contact" => $contact, "description" => "Barrel of Oil", "amount" => 500,); /* Invoke webservice method with your parameters, in this case: Function1 */ $response = $client->__soapCall("Function1", array($params)); /* Print webservice response */ var_dump($response); ?>

Как я знаю, что это работает?

  • Если вы выполняете print_r($params); вы увидите этот результат, поскольку ваш веб-сервис ожидает:

Array ( => Contact Object ( => 100 => John) => Barrel of Oil => 500)

  • Когда я отлаживал образец.NET webservice, я получил следующее:

(Как вы можете видеть, Contact объект не является нулевым, а также другими параметрами, что означает, что ваш запрос был успешно выполнен с PHP-стороны).

  • Ответ от.NET webservice был ожидаемым и показан на стороне PHP:

object (stdClass) public "Function1Result" => string "Подробная информация о вашем запросе! id: 100, имя: John, описание: Barrel of Oil, количество: 500 "(длина = 98)

Надеюсь это поможет:-)

например:

Require_once "WSDLInterpreter-v1.0.0/WSDLInterpreter.php"; $wsdlLocation = "?wsdl"; $wsdlInterpreter = new WSDLInterpreter($wsdlLocation); $wsdlInterpreter->savePHP(".");

Я не знаю, почему мой веб-сервис имеет одинаковую структуру с вами, но ему не нужен класс для параметра, просто массив.

Например: - Мой WSDL:

5390a7006cee11e0ae3e0800200c9a66 831f8c1ad25e1dc89cf2d8f23d2af...fa85155f5c67627 VITS-STAELENS Zoethout thee 0.100 10K24 2012-12-31 Gladys Roldan de Moras

Calle General Oraá 26 (4º izda) 28006 Madrid ES
es

Var_dump($client->getFunctions()); var_dump($client->getTypes());

Вот результат:

Array 0 => string "OrderConfirmation createOrder(OrderRequest $createOrder)" (length=56) array 0 => string "struct OrderRequest { Identification identification; Delivery delivery; Parcel parcel; Receiver receiver; string reference; }" (length=130) 1 => string "struct Identification { string sender; string hash; string originator; }" (length=75) 2 => string "struct Delivery { Node from; Node to; }" (length=41) 3 => string "struct Node { string country; string node; }" (length=46) 4 => string "struct Parcel { string description; decimal weight; string orderNumber; date orderDate; }" (length=93) 5 => string "struct Receiver { string firstName; string surname; Address address; string email; string language; }" (length=106) 6 => string "struct Address { string line1; string line2; string postalCode; string city; string country; }" (length=99) 7 => string "struct OrderConfirmation { string trackingNumber; string reference; }" (length=71) 8 => string "struct OrderServiceException { string code; OrderServiceException faultInfo; string message; }" (length=97)

Так в моем коде:

$client = new SoapClient("http://packandship-ws.kiala.com/psws/order?wsdl"); $params = array("reference" => $orderId, "identification" => array("sender" => param("kiala", "sender_id"), "hash" => hash("sha512", $orderId . param("kiala", "sender_id") . param("kiala", "password")), "originator" => null,), "delivery" => array("from" => array("country" => "es", "node" => "",), "to" => array("country" => "es", "node" => "0299"),), "parcel" => array("description" => "Description", "weight" => 0.200, "orderNumber" => $orderId, "orderDate" => date("Y-m-d")), "receiver" => array("firstName" => "Customer First Name", "surname" => "Customer Sur Name", "address" => array("line1" => "Line 1 Adress", "line2" => "Line 2 Adress", "postalCode" => 28006, "city" => "Madrid", "country" => "es",), "email" => " ", "language" => "es")); $result = $client->createOrder($params); var_dump($result);

но это успешно!

Вы также можете использовать SOAP-сервисы:

"Spain", "CityName" => "Alicante"); $response = $soapclient->getWeather($params); var_dump($response); // Get the Cities By Country $param = array("CountryName" => "Spain"); $response = $soapclient->getCitiesByCountry($param); var_dump($response);

Это пример с реальным сервисом, и он работает.

Надеюсь это поможет.

Сначала инициализируйте веб-службы:

$client = new SoapClient("http://example.com/webservices?wsdl");

Затем установите и передайте параметры:

$params = array ("arg0" => $contactid, "arg1" => $desc, "arg2" => $contactname); $response = $client->__soapCall("methodname", array($params));

Обратите внимание, что имя метода доступно в WSDL в качестве имени операции, например:

Вам нужен многомерный массив, вы можете попробовать следующее:

$params = array(array("id" => 100, "name" => "John",), "Barrel of Oil", 500);

в PHP массив является структурой и очень гибким. Обычно с вызовами мыла я использую оболочку XML так неуверенно, если она будет работать.

РЕДАКТИРОВАТЬ:

То, что вы, возможно, захотите попробовать, это создать json-запрос для отправки или использования этого для создания xml-покупки, следующего за тем, что находится на этой странице: http://onwebdev.blogspot.com/2011/08/php-converting-rss-to-json.html

Вам нужно объявить договор класса

Class Contract { public $id; public $name; } $contract = new Contract(); $contract->id = 100; $contract->name = "John"; $params = array("Contact" => $contract, "description" => "Barrel of Oil", "amount" => 500,);

$params = array($contract, "description" => "Barrel of Oil", "amount" => 500,);

$response = $client->__soapCall("Function1", array("FirstFunction" => $params));

$response = $client->__soapCall("Function1", $params);

Большой вопрос, потому что многие разработчики, даже опытные, смущены тем, как PHP обрабатывает массивы в циклах foreach. В стандартном цикле foreach PHP создает копию массива, который используется в цикле. Копия отбрасывается сразу же после завершения цикла. Это прозрачно в работе простого цикла foreach. Например:

$set = array("apple", "banana", "coconut"); foreach ($set AS $item) { echo "{$item}\n"; }

Эти результаты:

Apple banana coconut

Таким образом, копия создается, но разработчик не замечает, потому что исходный массив не ссылается в цикле или после завершения цикла. Однако, когда вы пытаетесь изменить элементы в цикле, вы обнаружите, что они не изменены при завершении:

$set = array("apple", "banana", "coconut"); foreach ($set AS $item) { $item = strrev ($item); } print_r($set);

Эти результаты:

Array ( => apple => banana => coconut)

Любые изменения от оригинала не могут быть отмечены, на самом деле никаких изменений с оригиналом не происходит, даже если вы явно присвоили значение $ item. Это связано с тем, что вы работаете над $ item, поскольку он отображается в копии $ set, над которым работает. Вы можете переопределить это, захватив $ item по ссылке, например:

$set = array("apple", "banana", "coconut"); foreach ($set AS &$item) { $item = strrev($item); } print_r($set);

Эти результаты:

Array ( => elppa => ananab => tunococ)

Таким образом, это очевидно и наблюдаемо, когда $ item работает по ссылке, изменения, внесенные в $ item, производятся членам исходного набора $ set. Использование $ item по ссылке также не позволяет PHP создавать копию массива. Чтобы проверить это, сначала мы покажем быстрый скрипт, демонстрирующий копию:

$set = array("apple", "banana", "coconut"); foreach ($set AS $item) { $set = ucfirst($item); } print_r($set);

Эти результаты:

Array ( => apple => banana => coconut => Apple => Banana => Coconut)

Как показано в примере, PHP скопировал $ set и использовал его для перебора, но когда в цикле был использован $ set, PHP добавил переменные в исходный массив, а не в скопированный массив. В принципе, PHP использует только скопированный массив для выполнения цикла и назначения $ item. Из-за этого цикл выше выполняется только 3 раза и каждый раз добавляет другое значение в конец исходного набора $, оставляя исходный $ set с 6 элементами, но никогда не вступая в бесконечный цикл.

Однако, что, если бы мы использовали $ item по ссылке, как я уже упоминал ранее? Один символ добавлен к вышеуказанному тесту:

$set = array("apple", "banana", "coconut"); foreach ($set AS &$item) { $set = ucfirst($item); } print_r($set);

Результаты в бесконечном цикле. Обратите внимание, что это фактически бесконечный цикл, вам придется либо убить сценарий самостоятельно, либо дождаться завершения работы вашей ОС. Я добавил следующую строку в мой скрипт, поэтому у PHP будет очень быстро закончиться память, я предлагаю вам сделать то же самое, если вы собираетесь запускать эти бесконечные тесты цикла:

Ini_set("memory_limit","1M");

Итак, в этом предыдущем примере с бесконечным циклом мы видим причину, по которой PHP был написан, чтобы создать копию массива для перебора. Когда копия создается и используется только по структуре самой конструкции цикла, массив остается статичным во время выполнения цикла, поэтому вы никогда не столкнетесь с проблемами.

Фон:

Я создаю сайт webservices, который будет предоставлять множество типов простых сервисов поверх SOAP и, возможно, других протоколов. Цель состоит в том, чтобы упростить работу, например, конверсии, синтаксический анализ RSS, проверки спама и многие другие виды работы. Сайт будет ориентирован в основном на начинающих разработчиков.

Моя проблема:

Я никогда не разрабатывал ни С#, ни.NET. Я несколько лет назад взломал несколько VB6, но это так. Теперь мне нужно несколько примеров выполнения RPC-вызовов через SOAP в С# . Я попытался найти в Интернете и Stack Overflow, чтобы найти это, но не нашел много ресурсов, и я понятия не имею, как ранжировать ресурсы (которые являются старыми?, которые являются неправильными? И т.д.).

Я создал простую примерную службу, которая в PHP называется так:

getCurrentYear(); //This method returns an integer, called "year" ?>

Теперь я хочу называть этот метод как можно проще на С#. Все ссылки и примеры очень приветствуются. С чего бы мне начать? Какие классы/модули/что я могу использовать?

Решение не обязательно должно включать SOAP вообще, если есть лучшие коммуникационные рамки (задняя часть предназначена для расширения), но обратите внимание, что серверная сторона реализована в PHP на Unix, поэтому запатентованные решения Microsoft из вопрос на стороне сервера.

Обратите внимание, что мне это нужно, поэтому я могу написать документацию, возможную для J. Random Web Developer, чтобы следовать (даже если они находятся на общедоступном веб-хостинге). Поэтому я считаю, что лучший подход должен заключаться в том, чтобы делать это только в коде, но даже другие способы сделать это, конечно, приветствуются.

6 ответов

Как я понимаю, вы хотите вызвать свой веб-сервис из клиентского приложения С#. У вас уже есть служба и опубликованный файл WSDL (исправьте меня, если я ошибаюсь). Теперь самый простой способ - создать прокси-классы в приложении С# (этот процесс называется добавлением служебной ссылки). Есть два основных способа сделать это:.NET предоставляет службы ASP.NET, который является старым способом SOA и WCF, как предложил Джон, который является последней средой от MS и предоставляет множество протоколов, включая открытые и MS-приложения.

Теперь достаточно теории и давайте делать это шаг за шагом

Service1Client service = new Service1Client();

int year = service.getCurrentYear();

Надеюсь, что это поможет, если вы столкнетесь с какой-либо проблемой, сообщите нам.

Я сделал довольно много того, о чем вы говорите, и SOAP-совместимость между платформами имеет одно основное правило: CONTRACT FIRST. Не выводите WSDL из кода, а затем пытайтесь создать клиент на другой платформе. Все, что больше, чем функции типа "Hello World", скорее всего, не сгенерирует код, не сможет говорить во время выполнения или (мой любимый), не сможет правильно отправить или получить все данные без повышения ошибки.

Тем не менее, WSDL - это сложный, неприятный материал, и я избегаю писать его с нуля, когда это возможно. Ниже приведены некоторые рекомендации по надежному взаимодействию служб (с использованием веб-ссылок, WCF, Axis2/Java, WS02, Ruby, Python и т.д.):

Если вы можете заставить его работать в браузере, то что-то простое, как это работает

Var webRequest = WebRequest.Create(@"http://webservi.se/year/getCurrentYear"); using (var response = webRequest.GetResponse()) { using (var rd = new StreamReader(response.GetResponseStream())) { var soapResult = rd.ReadToEnd(); } }

Посмотрите также на NuSOAP. Если вы сейчас , это инструментарий, позволяющий вам подключаться из PHP к службе WCF.

Мне нужно подключиться к одному веб-сервису, и это все, что у меня есть:

    Пример вызова:

    Username Password

    Я знаю, что эта функция возвращает строку;

Это то, что я сделал до сих пор:

    Создал Service Reference, добавив только адрес WSDL, указанный в пункте 1.

    Создал экземпляр webservice и вызвал функцию со всем необходимым параметром, но не пользователем и паролем для заголовка.

Как мне продолжить? Заранее спасибо.

1 ответ

Это может быть хорошим местом для начала, если вам нужно добавить свои учетные данные; я думаю, вам, возможно, придется, так как вы получили их как-то. Часть, где вы добавляете свои учетные данные, указана ниже:

UsernameToken userToken = new UsernameToken(userName, password, PasswordOption.SendHashed); Service1 serviceProxy = new Service1(); SoapContext requestContext = serviceProxy.RequestSoapContext; requestContext.Security.Tokens.Add(userToken);

  1. Добавьте свои учетные данные, вставив их в определенный токен - тип которого принадлежит пространству имен Microsoft.Web.Services2.Security.Tokens
  2. Создайте прокси-сервер для вашей службы (в приведенном выше примере serviceProxy)
  3. Получите доступ к своему заголовку запроса через вашу службу RequestSoapContext
  4. Добавить токен в запрос

Кроме того, я думаю, вы могли бы пропустить часть "? Wsdl" в адресе, поскольку она относится к спецификации веб-сервиса. Как только это будет сделано, вы можете попытаться вызвать функцию и посмотреть, как все это получится: если функция должна что-то вернуть, проверьте, что вы ожидали.

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

Настройка

Для использования SOAP в php необходимо подключить модуль SOAP (входит в дистрибутив php5). Под windows это делается просто – необходимо дописать (именно дописать, так как эта строка там не просто закомментирована, она отсутствует вообще) в php.ini :
extension=php_soap.dll

Не забудьте перезапустить сервер, если php у вас установлен как модуль.


Создание SOAP-клиента по WSDL-документу

Создание SOAP-клиента обычно происходит по WSDL-документу , который представляет собой XML-документ в определенном формате, полностью описывающий тот или иной веб-сервис. За подробностями по поводу WSDL – отправляю Вас на сайт консорциума W3C - http://www.w3.org/TR/2005/WD-wsdl20-soap11-binding-20050510/ .

Главное же, что необходимо знать для того, чтобы построить клиента к веб-сервису – это знать URL его WSDL-документа.
Для примера возьмем веб-сервис "Currency Exchange Rate" от xmethods.com. Адрес этого веб-сервиса, который позволяет получать курсы валют в режиме онлайн - http://www.xmethods.net/sd/2001/CurrencyExchangeService.wsdl .

Второй важный момент – из описания веб-сервиса необходимо получить информацию о том, какие методы этот сервис предоставляет, и какие параметры мы должны передавать ему в качестве входных значений (очень похоже на вызов обычной функции php или метода класса). Обычно эта информация содержится в описании сервиса на его сайте. Наш веб-сервис для получения курса валют предоставляет метод getRate(), которому в качестве аргументов передаются коды валют.

И последнее – важно знать, что ожидать в качестве ответа: сколько значений, какого типа и т.п. Это также можно получить из описания.
А в результате код получается очень простым и компактным, почти элементарным:

// Использование Web-сервиса
// "Currency Exchange Rate" от xmethods.com

// Создание SOAP-клиента по WSDL-документу
$client = new SoapClient("http://www.xmethods.net/sd/2001/CurrencyExchangeService.wsdl");

// Поcылка SOAP-запроса и получение результата
$result = $client->getRate("us", "russia");

Echo ‘Текущий курс доллара: ’, $result, ‘ рублей’;
?>

Как видно из кода в конструктор класса SoapClient необходимо передать URL WSDL-документа и получить объект для работы с нужным веб-сервисом. Затем вызывается метод этого объекта, имя которого совпадает с именем самого метода веб-сервиса. Возвращает же этот метод желаемый нами результат.

Итак, этот простой пример иллюстрирует нам принцип построения SOAP-клиента для веб-сервисов на php. Однако в реальном приложении еще о многом придется позаботиться, в частности о том, что в момент обращения к веб-сервису он может быть временно недоступен или возвращать ошибку. Явно напрашивается использование блока try/catch/throw :)

mob_info