Как работает SOAP в PHP?

Всем привет

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

$client = new SoapClient("stock.wsdl"); // даем клиенту ссылку на документ с описанием службы

$result = $client -> getStock("3″); // доступные процедуры (наши функции, которые мы зарегистрировали в SOAP сервере) становятся методома объекта.

При вызове процедуры клиент шлет туда запрос через POST в теле, которого XML-документ с корневым тегом Envelope и содержащий header и body (вызовы процедур с параметрами). Такого же типа приходит и ответ от сервера веб-службы (заголовки и тело).

Мне интересно:
1. Как сервер понимает, что к нему пришел запрос и вызывает метод SOAP-сервера? Может там есть какая-то глобальная переменная, которую он проверяет по достижению $server->handle();
2. Как клиент достает ответ? Он парсит XML ответа, который прилетает в ответ на вызов метода (процедуры удаленного веб-сервиса) и просто вытягивает данные из него?

RPC, как я понял, это вообще уже устаревшая штука.

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Как уже неоднократно говорилось, нужно изучать актуальный материал — getjump.github.io/ru-php-the-right-way
А все эти допотопные рускоязычные видеокурсы только запутают и все равно придется после них переучиваться.

getjump.github.io/ru-php-the-right-way как я понял, это дополнение к php.net. Освоили язык, а потом уже допиливаем знания в норм вид

Не в тему но все же:
soap да на xml да еще под wsdl, это такое древнее о громоздкое творение что скорое всего пустая трата времени. imo конечно.

Та я уже понял. Просто препод в видео курсе за 2011 год рассказывает про такое и RPC. Без знания XML просто вынос мозга. Он и mysqli процедурно слегка объяснил. А вот json не расскажет.

Посоветоваил книги котерова и Addison-Wesley Professional — PHP and MySQL Web Development 4th Edition (2008), а они старые и там про такое говорят.

Я вот смотрю курс 2011 года и препод говорит, что в php нет finally блока у try-catch. Захожу в оф доки, а там есть

В общем как бы не пришлось читать php.net, чтобы получить сразу актуальную инфу

Если вы про курс Борисова, то у него есть и более новый вроде за 2013 год. И да WSDL еще актуален. Вообще советую внимательно посмотреть все. Из курсов «программирования» по PHP в русскоязычной среде этот наиболее полный и правильный в отличии от всяких поповых. Ну и как он там говорит, надо штудировать мануал.

Спасибо. Я курс 2013 года увидел на торренте, когда уже посмотрел 1 видео из 4-ого уровня курса 2011 года. Уже поздно :)

Полный, но. например, про существование NAN он ничего не сказал. Начал dxthf читать php.net. Узнаю много нового

Превратим dou в stackoverflow

Нужно понимать, что такое SOAP сервер и клиент. В общем случае их реализации абсолютно независимы. Может быть, например, сервер на PHP и клиент на браузерном JavaScript, может быть клиент на PHP и сервер на Java.

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

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

Нужно понимать, что такое SOAP сервер и клиент. В общем случае их реализации абсолютно независимы.
Это я знаю.

А что такое скаляр?

примитивное значение: число, строка.

спасибо. Препод, вроде, это литералом называл.

Литерал — текстовое представление значения. Например, [1, 2, 3] — полностью литерал массива из скаляров.

1. Класс SoapClient это просто удобная обвертка над работой со сторонним соап сервисом. Путь к wsdl что ты передаешь в конструкторе даёт твоему клиенту описание методов АПИ этого сервиса и задаёт типизацию параметров этих методов. Если в метод getStock отдать что-то заведомо невалидное, то запрос даже не уйдёт. А если все нормально, то уходит обычный хттп запрос с правильным XML в теле.
2. В переменной $result уже распарсенный ответ сервиса. Но у соап клиента есть методы для вытаскивания последнего запроса и ответа в чистом виде.

Да, у этого протокола недостаток в жёсткой типизации параметров. Но его часто можно встретить в платежных системах.

спасибо. А как сервер понимает, что пришел вызов его функции?

Например, он доходит до

$server->handle();

лезет в $_GLOBALS[’HTTP_RAW_POST_DATA’] и анализирует его содержание. Если там XML, то анализирует его структуру. Если там XML со структурой SOAP запроса, то он парсит его и делает вызовы?

Препод не особо про это все рассказывал. А у меня прямо огромный батхерт из-за того, что я не могу разобрать работу этой технологии по крупицам. Про HTTP_RAW_POST_DATA знакомый намекнул.

Хотя препод начал рассказывать про SPL и там батхерт иногда поболее :)

1. Как сервер понимает, что к нему пришел запрос и вызывает метод SOAP-сервера? Может там есть какая-то глобальная переменная, которую он проверяет по достижению $server->handle();
сервер привязан к урлу , можно повесить на какой нить /lala/la/la/pu и будет там
2. Как клиент достает ответ? Он парсит XML ответа, который прилетает в ответ на вызов метода (процедуры удаленного веб-сервиса) и просто вытягивает данные из него?
да
Может там есть какая-то глобальная переменная, которую он проверяет по достижению $server->handle();

Как я понял, в $_POST ничего не прийдет. Препод сказал, что $_POST заполняется только, если Content-Type = application/x-www-form-urlencoded или multipart/form-data

Підписатись на коментарі