我已解决了许多问题和困惑,请参阅
在开发PHP SOAP服务时(第一次)我遇到了很多错误。
让我绘制一个场景,以便更好地理解和根据我的理解
我手上的东西
<weburl>.asmx
)<wsdlink>
==&gt; https:... / Schemas / Informationservice.WSDL <other_wsdlink>
==&gt; https:... / Schemas / Orderuploadservice.WSDL <cert>.pem
和<cert>.CER
以及<cert>.PFX
)从PHP SOAP Documentation的参考资料中,我创建了此 class
PS 此网络服务位于 ASP.net 和 SOAP 1.1 ,因此请使用http s < / p>
下面是主要代码部分
$x = new SoapClient(<wsdlink>, [
// 'local_cert' => '<cert>.pem',
// 'allow_self_signed' => true,
// 'cache_wsdl' => WSDL_CACHE_NONE,
'location' =>'https://192.168.xx.xx/wsdl/try.php',
'uri' =><other_wsdlink>,
'passphrase' => $passphrase,
'exceptions' => false,
'trace' => true,
'soap_version' => SOAP_1_1
//'connection_timeout'=>2000,
//'encoding'=> 'ISO-8859-1' // 'UTF-8'
]);
以下是2个案例
查看输出
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:Server</faultcode>
<faultstring>Procedure 'requestedMethodRequest' not present</faultstring>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
或有时(通过评论一些其他选项或chaning the uri)它给出了
<SOAP-ENV:Envelope>
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:Server</faultcode>
<faultstring>Function 'requestedMethod' doesn't exist</faultstring>
</SOAP-ENV:Fault>
</SOAP-ENV:Body></SOAP-ENV:Envelope>
尽管函数存在于return SoapServer::getFunctions()
Array
(
[0] => firstFunctionWithoutParam
[1] => secondFunctionWithoutParam
[2] => requestedMethodResponse RequestedMethod(requestedMethodRequest $messagePart)
[3] => secondFunctionClassParam
)
警告:SoapClient :: SoapClient():
- Unable to set private key file <cert>.pem - failed to create an SSL handle - Failed to enable crypto - (<wsdlink>):failed to open stream: operation failed - I/O warning : failed to load external entity <wsdlink>
致命错误:SOAP-ERROR: 解析WSDL:无法从
<wsdlink>
加载:无法加载外部实体<wsdlink>
我搜索并阅读各种博客的所有错误并应用了他们的建议但到目前为止没有运气。从this blog之一,我删除了/tmp/wsdl*
中的任何临时文件,并使用ini_set
禁用了wsdl缓存
ini_set('soap.wsdl_cache_enabled',0);
ini_set('soap.wsdl_cache_ttl',0);
我的疑问和疑惑是:
我是否需要在构造函数中设置soapClient
和soapServer
?
我是否需要为证书文件设置额外的规则?
$uri
选项的作用(是强制性的)以及为请求发送的内容或
这是证书问题还是系统或网络问题( UBUNTU 14.04 ),如果是,那么如何检查?
更改许可证书
openssl pkcs12 -in certificatefile.PFX -out certfile.pem -nodes -clcerts
并取消注释cert
选项并评论 __ doRequest 方法中的所有preg_replace
代码
但现在标头问题被提出。我注意到我发送的请求正在被修剪或删除。
我通过SoapClient::__soapCall
发送的请求是
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<addressVerificationRequest xmlns="urn:DCNZ.MSP.Wireline.Wholesale.Common">
<addressVerification>
<samId xmlns="urn:DCNZ.MSP.Wireline.Wholesale.Common">string</samId>
...
<postalCode xmlns="urn:DCNZ.MSP.Wireline.Wholesale.Common">string</postalCode>
</addressVerification>
</addressVerificationRequest>
</soap:Body>
</soap:Envelope>;
和var_dump($client->__getLastRequest());
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:DCNZ.MSP.Wireline.Wholesale.Messages">
<SOAP-ENV:Body><ns1:addressVerificationRequest/></SOAP-ENV:Body>
</SOAP-ENV:Envelope>'
上面的标题问题已修复,它是生成错误uri
值的原因。它将是命名空间
答案 0 :(得分:0)
确保在PHP中获得正确类的任何简单方法是使用https://github.com/wsdl2phpgenerator/wsdl2phpgenerator它们提供一个命令行生成器,您可以使用您拥有的WSDL运行它,它将为您生成一堆PHP类所有请求和响应,最重要的是服务。
在您拨打网络服务的班级,您可以执行以下操作:
// Construct the service
$service = new Service();
// Construct the request
$request = new RequestMethod();
$request->element = "test";
// Call the function
$response = $service->callRequest($request);
// process response
die(var_dump($response));
如果你正在使用像框架这样的东西,你可能不得不重构生成的类,但它为你提供了一个很好的起点。