Разница между запросом SoapClient и запросом на завивку Soap в php
Я очень смущен тем, что
Soap curl request
Я нашел здесь пример
SOAP-запрос в PHP с CURL
и запрос Soap с использованием SoapClient
PHP
http://php.net/manual/en/class.soapclient.php
Мой вопрос и сомнения
Во-первых - все ли они выполняют одну и ту же цель.
Второе. Есть ли разница в производительности, если они используются для одной цели.
Заранее спасибо
Ответы
Ответ 1
Вы правы, что они выполняют ту же цель. Тем не менее, SoapClient имеет множество функций для поддержки запросов SOAP, встроенных и также использующих Curl.
Как вы можете видеть в обсуждении SOAP с Curl, программист создает SOAP-огибающую, SoapClient может это сделать для вас. То же самое можно сказать и для выполнения вызовов метода.
В конце концов, намного проще использовать SoapClient.
Ответ 2
Я провел бесчисленные часы работы с SOAP в PHP. Теперь я могу утверждать, что знаю его наизнанку.:)
Первый вопрос: SoapClient и cURL предназначены для разных целей. SoapClient - это все о SOAP, cURL - все о транспорте HTTP. Протокол доступа SOAP является одним уровнем над транспортным протоколом. SOAP может быть передан любым выбранным вами транспортом: часто документ SOAP (который является простым XML-документом) отправляется SMTP (то есть по электронной почте), чтобы проходить через ограничительные брандмауэры. cURL - это просто инструмент для доступа к некоторому веб-серверу.
Второй вопрос: время, затраченное на локальное выполнение, будет минимальным в cURL. Но этому будет противопоставлено низкое качество такого кода, поскольку оно не будет соответствовать стандарту SOAP, и оно обязательно потерпит неудачу так или иначе (и это может даже не дать вам об этом знать). Обычно в процессе выполнения большая часть времени будет потрачена на транспорт (т.е. На медленном сетевом/занятом веб-сервере), поэтому не имеет значения, какой способ вы будете использовать.
Теперь посмотрим под капотом: расширение мыла в PHP довольно неполно. Быстрый поиск слова "фиктивный" дает 33 разных места в коде. Большинство из них php_encoding.c. К сожалению, PHP SOAP в некоторых случаях просто не может создать правильный SOAP или не может понять правильную SOAP - интероперабельность - проблема. Большинство проблем между PHP и .NET SOAP, но я думаю, если вы попытаетесь получить доступ к .NET SOAP с помощью cURL, вам понадобится немного больше, чем несколько строк кода, чтобы это произошло. К счастью, простой SOAP довольно хорош в PHP SOAP и работает с другими реализациями SOAP. Если вы хотите использовать SoapHeaders или mustUnderstand, будьте готовы иметь немного кошмар. SoapHeaders относительно просты в использовании cURL. mustUnderstand будет довольно сложно сделать в cURL.
Основным преимуществом использования SoapClient является WSDL (язык описания веб-сервисов). В основном вы можете:
$client = new SoapClient("http://webserver.com/service.wsdl");
$client->executeRemoteFunction($paramters);
С помощью cURL вы не сможете это сделать, потому что у него нет парсера WSDL. Если удаленный конец изменит свои спецификации, реализация cURL потерпит неудачу и не даст вам знать. На этом этапе вы можете сказать: но если удаленный веб-сервер будет молча потерять executeRemoteFunction(), то я бы тоже не знал! Это не тот случай: SoapClient с выводом SoapFault, и вам нужно поймать его и обработать, или ваш script остановится с необработанным сообщением о исключении. В любом случае вы узнаете об этом.
Однако не ожидайте, что PHP SOAP сделает для вас что-то хорошее, например, проверку типов. Даже если удаленный WSDL потребует xs: integer PHP SOAP будет игнорировать его и будет отправлять любой тип, который вы предоставили бы молча. Проверка типов с помощью cURL? Не может быть сделано, потому что в WSDL нет поддержки.
Также, говоря о SOAP WSDL, имейте в виду, что PHP будет кэшировать WSDL в течение 7 дней (настройка по умолчанию). Быстрые изменения WSDL во время разработки мгновенно избавят вас от необходимости: очистка кеша WSDL не всегда легко. Но с другой стороны, вы можете полностью отключить кеш WSDL во время разработки: скорость пойдет вниз, но по крайней мере вы сможете развиваться, не имея "я не знаю, почему он не делает то, что я хочу!"
Поэтому, читая несколько хороших вещей в PHP SOAP, вы можете подумать, есть ли веские основания использовать cURL для SOAP. И мой ответ "да", есть. К сожалению, PHP SOAP не может создавать определенные типы SoapHeader. Поэтому, если вы перейдете к таким передовым материалам, вам нужно будет использовать SoapClient для создания документа SOAP, а затем изменить его с помощью некоторых инструментов XML (например, PHP DOM), а затем отправить его с помощью cURL. Но это совсем другая история.
Если вы только начинаете с SOAP в PHP, сделайте себе одолжение и придерживайтесь расширения PHP SOAP, а не cURL. Это более чистый способ работы с SOAP, он быстрый, поддерживается расширение (поэтому ожидайте, что его функциональная совместимость в конечном итоге повысится), он понимает WSDL и обеспечивает хорошую отчетность об ошибках и обработку.
Ответ 3
Первый вопрос:
Честно говоря, они заполняют ту же самую нишу в концепции.
Возможно, будет время, когда вы думаете, что "лучше" "распечатать" xml после некоторой модификации, рассматривая его как строку, а не строить и отправлять через мыло.
curl может делать больше, чем это, но когда применяется к контексту вызова ws soap, просто SOAP обрабатывает запрос как "сложный" объект, тогда как для curl ваше сообщение является строкой простой и простой.
Второй вопрос:
этот я не могу дать никакого определенного ответа. Я знаю, что вы можете сделать несколько сообщений с завихрением, но я никогда не замечал какого-либо конкретного удара по производительности, плюс есть некоторые рамки, такие как зебра, которые обертывают php curl для ( предположительно), но я никогда не пробовал их...
Но в конечном итоге завиток будет делать не больше, чем "отправить" строку в случае мыльной завивки. Я сомневаюсь, что может быть какая-то определенная деградация производительности.