Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.09.2007, 22:35   #1
bobadd
 
Регистрация: 25.09.2007
Сообщений: 6
По умолчанию Помогите разобраться со связкой PHP+SOAP+WSDL

Получил недавно в универе задание, суть такая:
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:operation
soapAction="http://example.com/getTerm"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
Что означает "soapAction", что это обозначает в целом.

Очень надеюсь на ваши ответы. К сожалению в SOAP+WSDL я новичок. Просьба объяснить внятно.

Заранее спасибо.

Последний раз редактировалось SkyM@n; 26.09.2007 в 01:50. Причина: Учимся оформлять код?
bobadd вне форума Ответить с цитированием
Старый 25.09.2007, 23:50   #2
SkyM@n
Laravel/Vue expert
Старожил Подтвердите свой е-майл
 
Аватар для SkyM@n
 
Регистрация: 08.08.2007
Сообщений: 2,832
По умолчанию

Читайте маны. Если читали, то чт о именно вас инетресует или непонятно для вас? Если не знали, где искать, то:
Цитата:
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns="http://schemas.xmlsoap.org/wsdl/">
Вы сами дали себе ответ А также, очень советую зайти на сайт веб-школы. Кстати, он уменя в подписи.
SkyM@n вне форума Ответить с цитированием
Старый 26.09.2007, 00:23   #3
bobadd
 
Регистрация: 25.09.2007
Сообщений: 6
По умолчанию

Ну насчет "сам себе дал ответ" =) Я не понимаю, почему используются внешние ресурсы.
bobadd вне форума Ответить с цитированием
Старый 26.09.2007, 00:34   #4
SkyM@n
Laravel/Vue expert
Старожил Подтвердите свой е-майл
 
Аватар для SkyM@n
 
Регистрация: 08.08.2007
Сообщений: 2,832
По умолчанию

w3c - всемирный консорциум веб-стандарта. Их сервер вряд ли "загнется", там куча зеркал. Потому и ссылки все на него. Если вы директор предприятия, то все бумаги внутри вашего предприятия будут с логотипом/штампом предприятия, так? Тут почти так же.
SkyM@n вне форума Ответить с цитированием
Старый 26.09.2007, 00:39   #5
bobadd
 
Регистрация: 25.09.2007
Сообщений: 6
По умолчанию

хм. ну, а почему бы самому такой файлик не наваять? Я код видел, особо трудного там нет вроде ничего. Странно, ведь можно допустим разом сделать это всё платным. Тогда загнутся все wsdl сервисы?
bobadd вне форума Ответить с цитированием
Старый 26.09.2007, 00:42   #6
SkyM@n
Laravel/Vue expert
Старожил Подтвердите свой е-майл
 
Аватар для SkyM@n
 
Регистрация: 08.08.2007
Сообщений: 2,832
По умолчанию

Да нет, не загнутся конечно. Да и никто платным это не сделает. А этот файлик вы можете скопировать себе на сервер и юзать его оттуда или еже откуда-то - на здоровье
И свой тоже можете сделать. и скопировать на диск С:\ а в коде прописывать путь туда.
SkyM@n вне форума Ответить с цитированием
Старый 26.09.2007, 00:50   #7
bobadd
 
Регистрация: 25.09.2007
Сообщений: 6
По умолчанию

Благодарю.
Такой вопрос, насчет пункта (3). Я прочитал несколько мануалов по wsdl, и не нашёл описания данной структуры. К ней обычно переходили как к обычному и широко известному. Не могли бы вы меня просвятить на эту тему?
bobadd вне форума Ответить с цитированием
Старый 26.09.2007, 01:42   #8
SkyM@n
Laravel/Vue expert
Старожил Подтвердите свой е-майл
 
Аватар для SkyM@n
 
Регистрация: 08.08.2007
Сообщений: 2,832
По умолчанию

Цитата:
Сообщение от 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.

Последний раз редактировалось SkyM@n; 26.09.2007 в 01:48.
SkyM@n вне форума Ответить с цитированием
Старый 27.09.2007, 22:06   #9
bobadd
 
Регистрация: 25.09.2007
Сообщений: 6
По умолчанию

Более менее разобрался. Работает. Но одна проблема:
При передачи сообщения, ответ не приходит.
Пхпшник:
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:\n" $client->__getLastRequestHeaders() . "\n";
  echo 
"REQUEST:\n" $client->__getLastRequest() . "\n";
  echo 
"RESPONSE:\n" $client->__getLastResponseHeaders() . "\n";
  echo 
"RESPONSE:\n" $client->__getLastResponse() . "\n";

?>
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:\home\localhost\www\new2.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:\home\localhost\www\new2.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:\home\localhost\www\new.php
    [line:protected] => 13
    [trace:private] => Array
        (
            [0] => Array
                (
                    [function] => __doRequest
                    [class] => SoapClient
                    [type] => ->
                    [args] => Array
                        (
                            [0] => 
123

                            [1] => Z:\home\localhost\www\new2.php
                            [2] => Z:\home\localhost\www\new2.php
                            [3] => 1
                            [4] => 0
                        )

                )

            [1] => Array
                (
                    [function] => __call
                    [class] => SoapClient
                    [type] => ->
                    [args] => Array
                        (
                            [0] => NewOperation
                            [1] => Array
                                (
                                    [0] => 123
                                )

                        )

                )

            [2] => Array
                (
                    [file] => z:\home\localhost\www\new.php
                    [line] => 13
                    [function] => NewOperation
                    [class] => SoapClient
                    [type] => ->
                    [args] => Array
                        (
                            [0] => 123
                        )

                )

        )

    [faultstring] => Unable to parse URL
    [faultcode] => HTTP
)
REQUEST:

REQUEST:

123

RESPONSE:

RESPONSE:

P.S. Скорее всего дело в ссылке на обработчик сообщений (new2.php). Но я как только не пробовал. Посоветуйте кто что может

Последний раз редактировалось bobadd; 27.09.2007 в 22:13.
bobadd вне форума Ответить с цитированием
Старый 03.11.2007, 12:58   #10
aky
Новичок
Джуниор
 
Регистрация: 03.11.2007
Сообщений: 1
По умолчанию

http://www.jool.nl/new/1,webservice_helper.html

Удобный, рабочий помошник для создания web-сервисов и wsdl описаний к ним. Не стал разбираться в Вашей проблеме, может ссылка поможет.
aky вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
soap wsdl nimf Общие вопросы Delphi 0 22.08.2008 16:10
Помогите разобраться с С++ igroman Общие вопросы C/C++ 1 03.08.2008 23:15
WSDL + русская кодировка = проблемы bobadd PHP 1 24.10.2007 18:48