Пишем SOAP клиент-серверное приложение на PHP. Как сделать SOAP-вызов PHP с использованием класса SoapClient Отправляем сложные объекты

💖 Нравится? Поделись с друзьями ссылкой

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

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

    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" в адресе, поскольку она относится к спецификации веб-сервиса. Как только это будет сделано, вы можете попытаться вызвать функцию и посмотреть, как все это получится: если функция должна что-то вернуть, проверьте, что вы ожидали.

SOAP (Simple Object Access Protocol) представляет из себя основанный на XML протокол, предназначенный для обмена структурированной информацией между распределенными приложениями поверх существующих в веб протоколов, например HTTP. Спецификация SOAP определяет формат, используемый XML-сообщениями, то, как они должны обрабатываться набор правил кодирования для стандарта, типы данных а также соглашения для вызова удаленных процедур и ответы на вызовы.

Веб-сервисы - это модная и современная технология. Список технологий, относящихся к веб-сервисам увеличивается практически ежедневно, но SOAP является, вероятно, наиболее важной из них. Он стремительно становится стандартным протоколом доступа к веб-сервисам. Он использует XML-сообщения для обмена информацией между конечными точками, и в тоже время предоставляет некоторые преимущества бинарных протоколов. Поддержка RPC (Remote Procedure Calls) в начале была одной из незначительных возможностей протокола SOAP, но сейчас она превратилась в одну из наиболее часто используемых возможностей.

SOAP-расширение для PHP 5 - это первая попытка организовать поддержку SOAP в PHP на Си. У нее есть несколько преимуществ перед существующими реализациями SOAP, написанными на PHP, и самое важное из них - скорость. В данный момент расширение считается экспериментальным, но постепенно оно будет становиться все боле надежным и стабильным.

В расширении SOAP реализованы большие подмножества спецификаций SOAP 1.1, SOAP 1.2 и WSDL 1.1. Главная цель - максимально использовать RPC-возможности SOAP. Везде, где это возможно используется WSDL, чтобы сделать реализацию веб-сервисов более простой.

Первый SOAP-клиент

Чтобы продемонстрировать создание простого SOAP-клиента используем демонстрационный сервис "Delayed Stock Quote" с сайта XMethods. Перед тем как мы начнем писать PHP-код, необходимо собрать следующую информацию о данном конкретном сервисе:

  • Имя метода
  • URL по которому расположен этот сервис
  • Значение заголовка SOAPAction метода
  • Пространство имен метода
  • Имена и типы входных и выходных параметров метода

К счастью, вся эта информация доступна на сайте XMethods по адресу http://www.xmethods.com/ из RPC-профиля сервиса:

Имя метода getQuote
URL сервиса http://66.28.98.121:9090/soap
SOAPAction urn:xmethods-delayed-quotes#getQuote
Пространство имен метода urn:xmethods-delayed-quotes
Входные параметры Symbol (String)
Выходные параметры Result (float)

Пример 1 (client1.php)

$client = new SoapClient (NULL ,
array(
"location" => "http://66.28.98.121:9090/soap" ,
"uri" =>
"style" => SOAP_RPC ,
"use" => SOAP_ENCODED
));

Print($client -> __call (
/* Имя SOAP-метода */
"getQuote" ,
/* Параметры */
array(
new SoapParam (
/* Значение параметра */
"ibm" ,
/* Имя параметра */
"symbol"
)),
/* Опции */
array(
/* Пространство имен SOAP-метода */
"uri" => "urn:xmethods-delayed-quotes" ,
/* HTTP-заголовок SOAPAction для SOAP-метода */
"soapaction" => "urn:xmethods-delayed-quotes#getQuote"
)). "\n" );
?>

Как видите, решение этой простой задачи потребовало довольно много работы.

К счастью веб-сервисы могут описывать себя клиентам с помощью WSDL, в целом это довольно удобно. WSDL для сервиса "Delayed Stock Quote" представлен на его информационной страничке на сайте xmethods.com - http://services.xmethods.net/soap/urn:xmethods-delayed-quotes.wsdl .

Вот вариант этого же клиента, переписанный для работы с помощью этого WSDL-документа. Здесь нам уже не нужно указывать URI-сервера, пространство имен, заголовок SOAPAction, способ кодирования и типы параметров. Вся эта информация берется из WSDL файла.

Пример 2 (client2.php)

$client = new
SoapClient (
"http://services.xmethods.net/soap/urn:xmethods-delayed-quotes.wsdl"
);

Print($client -> getQuote ("ibm" ));
?>

Так несколько проще, правда?

Какие проблемы возникают при использовании WSDL? Единственный аргумент против его использования состоит в том, что клиент должен прочитать WSDL с сервера до того, как можно будет вызвать какую-нибудь процедуру, а в веб это может занять довольно много времени. Для того, чтобы ускорить работу в SOAP-расширении предусмотрены следующие параметры конфигурации: soap.wsdl_cache_enabled, soap.wsdl_cache_dir and soap.wsdl_cache_ttl. Их можно задать в файле php.ini или с помощью ini_set()(см. Пример 4). По умолчанию кэширование WSDL включено и WSDL-файлы кэшируются на 1 день.

Вот раздел SOAP файла php.ini с значениями по умолчанию. Вы можете скопировать их в свой php.ini.

[ soap ]

Soap . wsdl_cache_enabled = "1"
; включает или выключает кэширование WSDL

Soap . wsdl_cache_dir = "/tmp"
; задает имя директории в которой SOAP - расширение будет хранить кэшированные файлы

Soap . wsdl_cache_ttl = "86400"
; (время жизни ) устанавливает время (в секундах ) которое файлы из кэша могут использоваться

Первый SOAP-сервер

Попробуем написать собственный SOAP веб-сервис, который будет делать тоже, что и сервис "Delayed Stock Quote" с XMethods.

Первое, что нужно сделать - это создать WSDL-документ, описывающая наш сервис в формате, понятном клиентам. Для этого понадобится несколько изменить взятый с сайта Xmethods оригинальный документ, потому начнем мы с того, что рассмотрим его более подробно.

Раздел message определяет два сообщения. Первое - getQuoteRequest, которое передает сообщение getQuote и принимает одностроковый параметр с именем symbol. Второе сообщение - getQuoteResponse, ответ на запрос getQuote, передающий одно значение типа float с именем Result.

Раздел portType определяет единственную операцию getQuote, которая указывает, какое из описанных в разделе message будет использоваться для запроса, а какое для ответа.

В разделе binding определяется как сообщение должно кодироваться и передаваться. В данном случае в нем указано, что мы пошлем RPC-запрос через HTTP, используя SOAP-кодирование. Здесь также определены пространство имен и значение заголовка SOAPAction для метода getQuote.

И наконец в разделе service определяется URL по которому находится сервис.

Пример 3 (stockquote.wsdl)


targetNamespace="http://example.org/StockQuote"
xmlns:tns=" http://example.org/StockQuote "
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns="http://schemas.xmlsoap.org/wsdl/">












transport="http://schemas.xmlsoap.org/soap/http"/>



encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>


encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>








Замечание: по умолчанию кэширование WSDL включено. На время разработки и отладки вашего WSDL, кэширование лучше отключить.

Теперь самое время приступить к созданию нашего сервера.

Прежде всего мы разработаем функцию getQuote(), которая будет обрабатывать входящие запросы из веб. Далее мы создадим объект класса SoapServer и присоединим к нему нашу функцию с помощью метода SoapServer::addFunction(). Как вы увидите в дальнейшем, у конструктора SoapServer() есть только один параметр - путь к WSDL-документу, описывающему сервис.

Пример 4 (server1. php)

$quotes = array(
"ibm" => 98.42
);


global $quotes ;
return $quotes [ $symbol ];
}

Ini_set ("soap.wsdl_cache_enabled" , "0" ); // отключаем кэширование WSDL
$server = new SoapServer ("stockquote1.wsdl" );
$server -> addFunction ("getQuote" );
$server -> handle ();
?>

SoapServer может работать и без WSDL, примерно также как клиент, но у такого варианта нет никаких преимуществ, из-за которых стоило бы его использовать. Если вы все же хотите работать именно так, вы должны убедиться что возвращаемые значения - это объекты классов SoapParam и SoapVar(как в первом примере.

Вот клиент для доступа к нашему SOAP-серверу. По сравнению с предыдущим примером добавилась только ссылка на местонахождение WSDL. Предполагается, что файл "stockquote1.wsdl" лежит в той же директории что и SOAP-сервер.

Пример 5 (client3.php)

$client = new SoapClient ("stockquote1.wsdl" );
print($client -> getQuote ("ibm" ));
?>

Какие основные проблемы есть в наших клиенте и сервере?

Для начала, они не обрабатывают ошибки. Что происходит, когда сервер не находит подходящий результат для переданного ему значения переменной symbol? В SOAP существует специальный формат сообщений для сообщений об ошибках - SoapFault.Чтобы сгенерировать такое сообщение, сервер должен вызвать исключение с помощью объекта SoapFault. Первый параметр конструктора SoapFault() это строка с кодом ошибки, второй - строка с описанием ошибки. Клиент должен быть написан так, чтобы обрабатывать исключения SoapFault.

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

Пример 6 (server2.php)

class QuoteService {
private $quotes = array("ibm" => 98.42 );

Function getQuote ($symbol ) {
if (isset($this -> quotes [ $symbol ])) {
return $this -> quotes [ $symbol ];
} else {
throw new
SoapFault ("Server" , "Unknown Symbol "$symbol"." );
}
}
}

$server = new SoapServer ("stockquote2.wsdl" );
$server -> setClass ("QuoteService" );
$server -> handle ();
?>

Как видите, я использовал метод SoapServer::setClass() для соединения объекта SoapServer с классом QuoteService.

Пример 7 (client4.php)

$client = new SoapClient ("stockquote2.wsdl" );
try {
echo "

\n"
; 
print($client -> getQuote ("ibm" ));
echo "\n" ;
print($client -> getQuote ("microsoft" ));
echo "\n
\n" ;
} catch (SoapFault $exception ) {
echo $exception ;
}
?>

А что внутри?

Если вы хотите разобраться в формате SOAPсообщений, или хотите самостоятельно отлаживать SOAP-клиента, то этот раздел для вас.

Как вы видели в первом примере, конструктор SoapClient() принимает ассоциативный массив в качестве второго параметра. С помощью этого массива мы можем вызывать различные опции на сервере.

Посмотрим две из них:

  • trace - позволяет клиенту сохранять SOAP-запросы и ответы (по умолчанию выключено).
  • exceptions - позволяет клиенту контролировать механизм исключений (по умолчанию включено).

Посмотрим на следующий пример SOAP-клиента. Это доработанный клиент из Примера 5, в точности показывающий, что передается между клиентом и сервером. Для получения этой информации используются методы __getLastRequest() и __getLastResponse().

Пример 8 (client5.php)

$client = new SoapClient ("stockquote1.wsdl" ,array(
"trace" => 1 ,
"exceptions" => 0 ));
$client -> getQuote ("ibm" );
print "

\n"
; 
print "Запрос:\n" . htmlspecialchars ($client -> __getLastRequest ()) . "\n" ;
print "Ответ:\n" . htmlspecialchars ($client -> __getLastResponse ()). "\n" ;
print "
" ;
?>

Вот вывод скрипта. Он немного изменен, для упрощения понимания.

Запрос:



xmlns:xsd="http://www.w3.org/2001/XMLSchema"

SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">


ibm


Ответ:


xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns1="urn:xmethods-delayed-quotes"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">


98.42


Другие реализации SOAP для PHP

Все они написаны на PHP, а не на Си.

Резюме

В этой статье я описал только основные функции SOAP-расширения. На самом деле оно может гораздо больше, но продемонстрировать все его возможности в рамках одной короткой статьи попросту невозможно. Вот список главных из них:

  1. Поддержка комплексных типов данных (массивов, объектов)
  2. Поддержка SOAP - заголовков
  3. Динамическая поддержка SOAP 1.1 и SOAP 1.2

Возможно они будут более подробно рассмотрены в последующих статьях.

Подробная документация по SOAP-расширению расположена по адресу http://www.php.net/manual/en/ref.soap.php .

Разработка этого расширения находится на начальном этапе, поэтому ваши отзывы помогут сделать его более стабильным, надежным, удобным и быстрым. Пожалуйста сообщайте о всех возникающих при его использовании проблемах по адресу http://bugs.php.net/ .

Ссылки

Об авторе

Не буду останавливаться на вопросе, что такое веб-сервисы и зачем они нужны. В сети очень много статей на эту тему. Просто постараюсь вкратце показать, каким простым способом возможно создание клиента к любому веб-сервису на 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 :)

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

  • Contact ID
  • Контактное имя
  • Общее описание
  • Сумма

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

$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 с данными:

  • Contact ID: 100
  • Контактное лицо: John
  • Общее описание: Barrel of Oil
  • Сумма: 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,);

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

8 ответов

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

Просто чтобы знать, я попытался воссоздать вашу ситуацию...

  • В этом примере я создал веб-сервис.NET с помощью WebMethod под названием Function1 , и это параметры:

Функция1 (контактный контакт, описание строки, количество int)

    В котором Contact есть только bean class , который имеет getters и seters для id и name , как в вашем случае.

    Вы можете загрузить этот веб-сервис.NET с помощью:

Код.

Это то, что вам нужно сделать на стороне 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); , вы увидите этот вывод, поскольку ваш веб-сервис ожидает:

Массив ([Контакт] = > Контактный объект ( = > 100 = > John) [описание] = > Бочка с маслом [количество] = > 500)

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

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

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

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

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

Вы также можете использовать 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 в качестве имени операции, например:

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

Например: - Мой 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
[email protected] 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" => "[email protected]", "language" => "es")); $result = $client->createOrder($params); var_dump($result);

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

Это хороший пример для функции SOAP "__call". Однако он устарел.

Envio Internacional: "; $vem = $cliente->__call("CustoEMSInternacional",array($int_zona, $int_peso)); print $vem; print "

"; ?>

Фон:

Я создаю сайт 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.

Рассказать друзьям