无法将soapUI转换为PHP函数

时间:2016-12-09 16:50:37

标签: php web soap service wsdl

我已经在SOAP连接上苦苦挣扎了好几个小时而无法让它工作,这就是我所拥有的:

$url  = 'https://xxx/connector.svc?singleWsdl';
$user = 'user';
$pass = 'pass';

$options = array(
        'uri'=>'http://schemas.xmlsoap.org/soap/envelope/',
        'style'=>SOAP_RPC,
        'use'=>SOAP_ENCODED,
        'soap_version'=>SOAP_1,
        'cache_wsdl'=>WSDL_CACHE_NONE,
        'connection_timeout'=>15,
        'trace'=>true,
        'encoding'=>'UTF-8',
        'exceptions'=>true,
    );
try {
    $soapclient = new SoapClient($url, $options);
#   $soapclient = new SoapClient($url);
}
catch(Exception $e) {
    die($e->getMessage());
}

我试过'?wdsl'然后我得到了:

PHP Fatal error:  SOAP-ERROR: Parsing WSDL: <message> 'IConnector_GetProduct_ServiceFaultFault_FaultMessage' already defined

没有参数的请求可以正常工作:

$result = $soapclient->GetVersionInfo();
$last_request  = $soapclient->__getLastRequest();
$last_response = $soapclient->__getLastResponse();
print "Request:  ".$last_request ."\n";
print "Response: ".$last_response."\n";
print_r($result);

结果:

Request:  <?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="Unit4.AgressoWholesale.Connectors"><SOAP-ENV:Body><ns1:GetVersionInfo/></SOAP-ENV:Body></SOAP-ENV:Envelope>

Response: <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><GetVersionInfoResponse xmlns="Unit4.AgressoWholesale.Connectors"><GetVersionInfoResult xmlns:a="http://schemas.datacontract.org/2004/07/Unit4.AgressoWholesale.Common.Contracts" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><a:FullVersion>14.4.18.0</a:FullVersion><a:Release>14</a:Release><a:ServicePack>4</a:ServicePack><a:Fix>18</a:Fix><a:Version>0</a:Version><a:CustomCode/><a:AWBuild>38</a:AWBuild><a:AWFix>003</a:AWFix><a:AWCustomBuild/><a:AWCustomFix/><a:AWCustomCustomerCode/></GetVersionInfoResult></GetVersionInfoResponse></s:Body></s:Envelope>
stdClass Object
(
    [GetVersionInfoResult] => stdClass Object
        (
            [FullVersion] => 14.4.18.0
            [Release] => 14
            [ServicePack] => 4
            [Fix] => 18
            [Version] => 0
            [CustomCode] =>
            [AWBuild] => 38
            [AWFix] => 003
            [AWCustomBuild] =>
            [AWCustomFix] =>
            [AWCustomCustomerCode] =>
        )

)

到目前为止一直很好,但麻烦开始尝试登录,这是必须的.​​.在SoapUI中它适用于:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:unit="Unit4.AgressoWholesale.Connectors" xmlns:unit1="http://schemas.datacontract.org/2004/07/Unit4.AgressoWholesale.Common.Contracts">
   <soapenv:Header/>
   <soapenv:Body>
      <unit:Login>
         <unit:SecurityContext>
            <unit1:SessionToken></unit1:SessionToken>
            <unit1:UserId>user</unit1:UserId>
            <unit1:Password>pass</unit1:Password>
         </unit:SecurityContext>
      </unit:Login>
   </soapenv:Body>
</soapenv:Envelope>

但是把它转换成PHP,我在这里搁浅..这就是我尝试过的:

$data = array( 'SecurityContext' => array( 'SessionToken' => ''
                                        ,'Password'     => $user
                                        ,'UserId'       => $pass)
                            );
$data = array( 'SessionToken' => ''
                            ,'Password'     => $user
                            ,'UserId'       => $pass
                            );

$data = new stdClass;
$data->SecurityContext = new stdClass;
$data->SecurityContext->SessionToken = '';
$data->SecurityContext->UserId       = $pass;
$data->SecurityContext->Password     = $user;

#$result = $soapclient->__call('Login',array($data));
#$result = $soapclient->Login($data);
$result = $soapclient->__soapCall('Login',array($data));

但无论我尝试什么,没有参数的事件或空数组或stdClass,我得到:

PHP Fatal error:  Uncaught SoapFault exception: [s:ServiceFault] An exception occurred

这让我疯了,我在互联网上找不到关于致命事件的任何内容'[s:ServiceFault]'

我做错了什么?任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

好的,写出这个问题有时候就足以找到答案!

解决方案有两个方面:

1)使用try {} catch获得更好的错误报告:

try { 
    $result = $soapclient->__call('Login',array($data));
    #$result = $soapclient->Login($data);
    #$result = $soapclient->__soapCall('Login',array($data));
} catch (SoapFault $e) {
    $error = $e->faultcode;
    echo str_replace('>',">\n",$error) ;
}
$last_request = $soapclient->__getLastRequest();
$last_response= $soapclient->__getLastResponse();
print "\nRequest: " .str_replace('>',">\n",$last_request);
print "\nResponse: ".str_replace('>',">\n",$last_response);

这样我就能得到更多需要的信息!到:

2)在密码字段中输入密码,在用户字段中输入用户名

有效!

对于那些感兴趣的人

  • 使用数组结构和'new stdClass'都可以正常工作
  • 解析通话工作的三种方式(也是两个注释掉的方法,使用你喜欢的方式)