php中的SoapClient请求和Soap curl请求之间的区别

时间:2015-08-26 11:28:39

标签: php web-services curl soap

我对

非常困惑

Soap curl request我在这里找到了一个例子 SOAP request in PHP with CURL

和使用SoapClient PHP的Soap请求 http://php.net/manual/en/class.soapclient.php

我的疑问和怀疑是 首先 - 这些都填补了相同的目的。

第二 - 如果它们用于相同目的,是否存在任何性能差异。

提前致谢

3 个答案:

答案 0 :(得分:6)

你说他们是完全相同的。虽然,SoapClient有很多功能可以支持内置的SOAP请求,并且也在某个地方使用Curl。

正如您在关于SOAP with Curl的讨论中所看到的,程序员构造了SOAP信封,SoapClient可以为您做到这一点。进行方法调用同样适用。

最后,使用SoapClient要容易得多。

答案 1 :(得分:6)

我花了无数个小时在PHP中处理SOAP。现在我可以声称我内心深处了解它。 :)

第一个问题:SoapClient和cURL用于不同用途。 SoapClient是关于SOAP的,cURL是关于HTTP传输的。作为访问协议的SOAP比传输协议高一级。 SOAP可以通过您选择的任何传输进行传输:通常,SOAP文档(只是普通的XML文档)由SMTP(即通过电子邮件)发送,以便遍历限制性防火墙。 cURL只是一个访问某个Web服务器的工具。

第二个问题:在cURL中,在本地执行上花费的速度时间将是最小的。但是这样的代码质量低,因为它不会遵循SOAP标准,并且它必然会以这种或那种方式失败(它甚至可能不会让你知道它)。通常在执行中大部分时间都花费在传输上(即通过慢速网络/繁忙的Web服务器),因此使用哪种方式无关紧要。

现在让我们来看看:PHP中的Soap扩展是非常不完整的。快速搜索单词“bogus”会在代码中产生33个不同的位置。其中大多数是php_encoding.c。不幸的是,PHP SOAP在某些情况下无法生成正确的SOAP或无法理解正确的SOAP - 互操作性是一个问题。大多数问题都在PHP和.NET SOAP之间,但我想如果您尝试使用cURL访问.NET SOAP,则需要的不仅仅是几行代码才能实现。幸运的是,普通的SOAP在PHP SOAP中非常好,并且可以与其他SOAP实现一起使用。如果你想使用SoapHeaders或mustUnderstand准备好让你有点噩梦。 SoapHeaders使用cURL相对容易。在cURL中,mustUnderstand很难做到。

使用SoapClient的主要好处是WSDL(Web服务描述语言)。基本上你可以这样做:

$client = new SoapClient("http://webserver.com/service.wsdl");
$client->executeRemoteFunction($paramters);

使用cURL,您将无法执行此操作,因为它没有WSDL解析器。如果远程端将更改其规格,则cURL实现将失败并且不会让您知道。此时您可以说:但是如果远程Web服务器将以静默方式删除executeRemoteFunction(),那么我也不会知道!情况并非如此:SoapClient抛出SoapFault异常,您需要捕获并处理它,否则您的脚本将以未处理的异常消息停止。无论哪种方式,你都会知道它。

但是,不要指望PHP SOAP为您做一些好的事情,比如类型检查。即使远程WSDL需要xs:integer,PHP也会忽略它,并且会发送你默认提供的任何类型。用cURL键入检查?无法完成,因为首先没有WSDL支持。

另外,在谈到SOAP WSDL时,请注意PHP将缓存WSDL 7天(默认设置)。在开发过程中快速更改WSDL会立即让您遇到麻烦:清除WSDL缓存并不总是那么容易。但另一方面,你可以在开发过程中完全禁用WSDL缓存:速度会下降,但至少你可以在没有“我不知道为什么它不能做我想要的东西!”的情况下进行开发。

因此,阅读PHP SOAP中的一些好东西你可能想知道是否有任何理由使用cURL for SOAP。我的回答是'是',有。不幸的是,PHP SOAP无法创建某些类型的SoapHeader。因此,如果您使用这些高级内容,则需要使用SoapClient创建SOAP文档,然后使用某些XML工具(例如PHP DOM)对其进行修改,然后使用cURL将其发送出去。但这完全是另一回事。

如果你只是从PHP开始使用PHP,请自己帮个忙,坚持使用PHP SOAP扩展,而不是cURL。它是处理SOAP的更简洁的方法,它很快,维护扩展(因此期望它的互操作性最终会上升),它理解WSDL并提供良好的错误报告和处理。

答案 2 :(得分:-1)

第一个问题: 坦率地说,他们在概念上占据了相同的位置。 可能有一段时间你认为它更好"到"打印"修改后的xml将其视为字符串,而不是构建它并通过soap发送它。 curl可以做更多,但是当应用于ws soap调用的上下文时,只需将SOAP视为"复杂"实体,而对于curl,你的消息是一个简单而简单的字符串..

第二个问题: 这个我不能提供任何明确的答案..我知道你可以用curl做一些多发送,但我从来没有注意到任何特定的性能命中,加上有一些像斑马这样的框架,包裹了php curl for一个(假设的)性能提升,虽然我从未尝试过...... 但最终curl只会发送"发送"肥皂卷曲的字符串soo我怀疑可能有任何特定的性能下降..