使用php SOAP和WSDL的正确步骤是什么?

时间:2014-11-17 09:27:00

标签: php web-services soap wsdl

我已解决了许多问题和困惑,请参阅

Final Code and issue on this question


在开发PHP SOAP服务时(第一次)我遇到了很多错误。

让我绘制一个场景,以便更好地理解和根据我的理解

我手上的东西

  • 网址(<weburl>.asmx
  • 2个WSDL链接
    • <wsdlink> ==&gt; https:... / Schemas / Informationservice.WSDL
    • <other_wsdlink> ==&gt; https:... / Schemas / Orderuploadservice.WSDL
  • 3个证书文件(<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个案例


1。当我运行它(评论3行)时,它需要太多时间来响应并最终以XML形式给出错误,

  • 程序&#39; requestedMethodRequest&#39;不存在。
  • 功能&#39; requestedMethod&#39;不存在。

查看输出

<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
)

2.当我取消评论3行以上时,会出现多个警告和致命错误

  

警告: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);

我的疑问和疑惑是:

  1. 我是否需要在构造函数中设置soapClientsoapServer

  2. 我是否需要为证书文件设置额外的规则?

  3. $uri选项的作用(是强制性的)以及为请求发送的内容或

  4. 这是证书问题还是系统或网络问题( UBUNTU 14.04 ),如果是,那么如何检查?

  5. 更新

    更改许可证书

     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值的原因。它将是命名空间

1 个答案:

答案 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));

如果你正在使用像框架这样的东西,你可能不得不重构生成的类,但它为你提供了一个很好的起点。