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

Kul*_*ngi 11 php curl soap web-services

我很困惑

Soap curl request我在这里找到了一个带有CURL的PHP示例 SOAP请求

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

我的疑问和怀疑是第一 - 这些都填补了同样的目的.

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

提前致谢

Roe*_*zen 6

你是对的,他们填补了同样的目的.虽然,SoapClient有很多功能可以支持内置的SOAP请求,并且也在某个地方使用Curl.

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

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


Vla*_*sev 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);
Run Code Online (Sandbox Code Playgroud)

使用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并提供良好的错误报告和处理.