Получил недавно в универе задание, суть такая:
1. Отдел статистики делает "мне" запрос о статистических данных о преподавателях, моя задача вернуть эти данные. Всё бы ничего, да сделать это нужно через web сервисы. До того момента я никогда не работал с wsdl и soap.
Прочитал несколько примеров и описаний, картина, впринципе, практически вырисовалась.
Но как мне конкретно применить всё в моей ситуации - не хватает опыта. Надеюсь на вас.
2. В процессе изучения я наткнулся на непонимание вплане того, что во всех wsdl файлах присутствуют ссылки в definitions такого плана:
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns="http://schemas.xmlsoap.org/wsdl/">
Не понимаю этого. Просьба объяснить на что и как влияют эти ссылки. Насколько я понимаю, по этим ссылкам лежат XML схемы, но почему все используют внешние ресурсы? А что будет, если этот сервак прикроется?
3. Ни в одном описании я не нашёл объяснение данной структуры:
Код:
<binding type="glossaryTerms" name="b1"><soap:binding style="document"transport="http://schemas.xmlsoap.org/soap/http" /><operation><soap:operationsoapAction="http://example.com/getTerm"/><input><soap:body use="literal"/></input><output><soap:body use="literal"/></output></operation></binding>
Что означает "soapAction", что это обозначает в целом.
Очень надеюсь на ваши ответы. К сожалению в SOAP+WSDL я новичок. Просьба объяснить внятно.
Заранее спасибо.
Читайте маны. Если читали, то чт о именно вас инетресует или непонятно для вас? Если не знали, где искать, то:
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns="http://schemas.xmlsoap.org/wsdl/">
Вы сами дали себе ответ А также, очень советую зайти на сайт веб-школы. Кстати, он уменя в подписи.
Ну насчет "сам себе дал ответ" =) Я не понимаю, почему используются внешние ресурсы.
w3c - всемирный консорциум веб-стандарта. Их сервер вряд ли "загнется", там куча зеркал. Потому и ссылки все на него. Если вы директор предприятия, то все бумаги внутри вашего предприятия будут с логотипом/штампом предприятия, так? Тут почти так же.
хм. ну, а почему бы самому такой файлик не наваять? Я код видел, особо трудного там нет вроде ничего. Странно, ведь можно допустим разом сделать это всё платным. Тогда загнутся все wsdl сервисы?
Да нет, не загнутся конечно. Да и никто платным это не сделает. А этот файлик вы можете скопировать себе на сервер и юзать его оттуда или еже откуда-то - на здоровье
И свой тоже можете сделать. и скопировать на диск С: а в коде прописывать путь туда.
Благодарю.
Такой вопрос, насчет пункта (3). Я прочитал несколько мануалов по wsdl, и не нашёл описания данной структуры. К ней обычно переходили как к обычному и широко известному. Не могли бы вы меня просвятить на эту тему?
Сообщение от bobadd
3. Ни в одном описании я не нашёл объяснение данной структуры:
<binding type="glossaryTerms" name="b1">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http" />
<operation>
<soap:operation
soapAction="http://example.com/getTerm"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
Что означает "soapAction", что это обозначает в целом.
Что такое SOAP?
SOAP представляют Простой Протокол Объектного Доступа
SOAP является протоколом связи
SOAP для связи между приложениями
SOAP - формат для посылки сообщений
SOAP предназначен для связывания через Internet
SOAP кроссплатформенный
SOAP является языково-независимым
SOAP основан на XML
SOAP простой и расширяемый
SOAP позволяет Вам обходить файрволы
SOAP будет разработан как стандарт W3C
--------------------------------------------------------------------------------
Почему SOAP?
Важно для прикладной разработки допускать связь Internet между программами.
Сегодняшние приложения обычно юзают Удаленный Вызов Процедур (Панель управления-Службы-svchost.exe, RPC) между объектами подобно DCOM и CORBA, но HTTP не был разработан для этого. RPC представляет проблему совместимости и безопасности; файрволы и прокси обычно блокируют этот тип трафика.
Лучший путь связываться между приложениями - через HTTP, поскольку HTTP поддерживан всеми браузерами и Internet-серваками. SOAP был создан, чтобы выполнять именно это, ребята!!! Ура!
SOAP обеспечивает путь для общения между приложениями, работающими на других операционных системах, с другими технологиями и языками программирования.
--------------------------------------------------------------------------------
Мелкософт и SOAP
SOAP является ключевым элементом архитектуры Микрософта .NET для прикладной разработки будущего Internet.
--------------------------------------------------------------------------------
SOAP 1.1 было предложено W3C
Compaq, HP, IBM, Lotus, Мелкософтом, и др предлагался на W3C, в Мае 2000-го, SOAP-протокол Internet, который (они надеются) революционизирует прикладную разработку, соединяя UI десктоп-приложений с мощными серверами Internet, использовавшие стандарты Internet: HTTP и XML.
<binding type="glossaryTerms" name="b1">
<soap:binding style="document"transport="http://schemas.xmlsoap.org/soap/http" />
<operation>
<soap:operation soapAction="http://example.com/getTerm"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
Элемент binding имеет два атрибута - атрибут имени и атрибут типа.
Атрибут имени (Вы можете использовать любое имя, которое Вы хотите), определяет имя связи, и вспомогательные точки типа на порт для связи, в этом случае порт "glossaryTerms".
SOAP:связь элемента имеет два атрибута - атрибут стиля и атрибут транспорта.
Атрибут стиля может быть "rpc" или "документом". В этом случае, который мы используем - документ. Атрибут транспорта определяет протокол SOAP, ктороый будет использоваться. В этом случае - мы используем HTTP.
Действие элемента определяет каждое действие, которое порт подвергает.
Для каждого действия, соответствующее действие SOAP должно быть определенно. Вы должны также задать как ввод и вывод енкодирован (то есть какая кодировка). В этом случае, который мы используем "literal".
А действие (soapAction) осуществляется через http://example.com/getTerm.
Более менее разобрался. Работает. Но одна проблема:
При передачи сообщения, ответ не приходит.
Пхпшник:
PHP код:
<?php
ini_set("soap.wsdl_cache_enabled", "0"); // отключаем кэширование WSDL
echo 1<hr>;
$client = new SoapClient("1.wsdl", Array("exceptions"=>0,"trace" => 1));
$Types=$client->__getTypes();
$Functions=$client->__getFunctions();
print "<pre>";
print_r($Types);
print_r($Functions);
$result = $client->NewOperation(123);
print_r($result);
echo "REQUEST:" . $client->__getLastRequestHeaders() . "";
echo "REQUEST:" . $client->__getLastRequest() . "";
echo "RESPONSE:" . $client->__getLastResponseHeaders() . "";
echo "RESPONSE:" . $client->__getLastResponse() . "";
?>
WSDL код:
Код:
<?xml version="1.0" encoding="UTF-8"?><!-- edited with XMLSpy v2007 rel. 3 sp1 (http://www.altova.com) by Bobadd (EMBRACE) --><wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://new.webservice.namespace" xmlns:ns="http://schemas.xmlsoap.org/soap/encoding/" targetNamespace="http://new.webservice.namespace"><wsdl:types><xs:schema targetNamespace="http://new.webservice.namespace" elementFormDefault="qualified"/></wsdl:types><wsdl:message name="NewMessageRequest"><wsdl:part name="parameter" type="xs:string"/></wsdl:message><wsdl:message name="NewMessageResponse"><wsdl:part name="parameter" type="xs:string"/></wsdl:message><wsdl:portType name="NewPortType"><wsdl:operation name="NewOperation"><wsdl:input message="tns:NewMessageRequest"/><wsdl:output message="tns:NewMessageResponse"/></wsdl:operation></wsdl:portType><wsdl:binding name="NewBinding" type="tns:NewPortType"><soap:binding transport="http://schemas.xmlsoap.org/soap/http"/><wsdl:operation name="NewOperation"><soap:operation soapAction="Z:homelocalhostwwwew2.php"/><wsdl:input><soap:body use="literal"/></wsdl:input><wsdl:output><soap:body use="literal"/></wsdl:output></wsdl:operation></wsdl:binding><wsdl:service name="NewService"><wsdl:port name="NewPort" binding="tns:NewBinding"><soap:address location="Z:homelocalhostwwwew2.php"/></wsdl:port></wsdl:service></wsdl:definitions>
При печати результатов, выпадает следующее:
Код:
1--------------------------------------------------------------------------------Array()Array( [0] => string NewOperation(string $parameter))SoapFault Object( [message:protected] => Unable to parse URL [string:private] =>[code:protected] => 0 [file:protected] => z:homelocalhostwwwew.php [line:protected] => 13 [trace:private] => Array ( [0] => Array ([function] => __doRequest[class] => SoapClient[type] => ->[args] => Array ( [0] => 123 [1] => Z:homelocalhostwwwew2.php [2] => Z:homelocalhostwwwew2.php [3] => 1 [4] => 0 ) ) [1] => Array ([function] => __call[class] => SoapClient[type] => ->[args] => Array ( [0] => NewOperation [1] => Array ( [0] => 123 ) ) ) [2] => Array ([file] => z:homelocalhostwwwew.php[line] => 13[function] => NewOperation[class] => SoapClient[type] => ->[args] => Array ( [0] => 123 ) ) ) [faultstring] => Unable to parse URL [faultcode] => HTTP)REQUEST:REQUEST:123RESPONSE:RESPONSE:
P.S. Скорее всего дело в ссылке на обработчик сообщений (new2.php). Но я как только не пробовал. Посоветуйте кто что может
http://www.jool.nl/new/1,webservice_helper.html
Удобный, рабочий помошник для создания web-сервисов и wsdl описаний к ним. Не стал разбираться в Вашей проблеме, может ссылка поможет.