2013-06-12 91 views
2
// Based on http://stackoverflow.com/questions/3934639/soap-authentication-with-php 
include 'auth.php'; 
$soapURL = "http://traindata.njtransit.com:8090/NJTTrainData.asmx?WSDL" ; 
$soapParameters = array('UserCredentials'=>array('userName' => $username, 'password' => $password)); 

$soapFunction = "getTrainScheduleJSON" ; 
$soapFunctionParameters = Array('station' => "NY") ; 

$soapClient = new SoapClient($soapURL, $soapParameters); 

$soapResult = $soapClient->__soapCall($soapFunction, $soapFunctionParameters); 

这里是输出(下面)。它抱怨缺少必需的标题“UserCredentials”,但我有UserCredentials包括在内。或者我错过了什么?谢谢!PHP/SOAP:UserCredentials如何传递给SOAP请求?

PHP Fatal error: Uncaught SoapFault exception: [soap:MustUnderstand] System.Web.Services.Protocols.SoapHeaderException: Missing required header 'UserCredentials'. 
    at System.Web.Services.Protocols.SoapServerProtocol.ReadParameters() 
    at System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest() in /home/www/html/njtransit/wed.php:13 
Stack trace: 
#0 /home/www/html/njtransit/wed.php(13): SoapClient->__soapCall('getTrainSchedul...', Array) 
#1 {main} 
    thrown in /home/www/html/njtransit/wed.php on line 13 

这是另一个在__setSoapHeaders之前添加SoapHeader的尝试。我还添加了命名空间($ NS):

include 'auth.php'; 
$soapURL = "http://traindata.njtransit.com:8090/NJTTrainData.asmx?WSDL" ; 
$ns = 'http://microsoft.com/webservices/'; //Namespace of the WS. 
$soapParameters = array('UserCredentials'=>array('userName' => $username, 'password' => $password)); 

$soapFunction = "getTrainScheduleJSON" ; 
$soapFunctionParameters = Array('station' => "NY") ; 

// $soapClient = new SoapClient($soapURL, $soapParameters); 
$soapClient = new SoapClient($soapURL); 

$header = new SoapHeader($ns,'UserCredentials',$soapParameters,false); 

$soapClient->__setSoapHeaders($header); 
var_dump($soapClient); 
$soapResult = $soapClient->__soapCall($soapFunction, $soapFunctionParameters); 

这里是产出和新的错误消息,“对象引用不设置到对象的实例。”

object(SoapClient)#1 (3) { 
    ["_soap_version"]=> 
    int(1) 
    ["sdl"]=> 
    resource(5) of type (Unknown) 
    ["__default_headers"]=> 
    array(1) { 
    [0]=> 
    object(SoapHeader)#2 (4) { 
     ["namespace"]=> 
     string(33) "http://microsoft.com/webservices/" 
     ["name"]=> 
     string(15) "UserCredentials" 
     ["data"]=> 
     array(1) { 
     ["UserCredentials"]=> 
     array(2) { 
      ["userName"]=> 
      string(10) "myusername" 
      ["password"]=> 
      string(17) "mypassword" 
     } 
     } 
     ["mustUnderstand"]=> 
     bool(false) 
    } 
    } 
} 
PHP Fatal error: Uncaught SoapFault exception: [soap:Server] System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.NullReferenceException: Object reference not set to an instance of an object. 
    at DepartureVisionServiceXMLExternal.ServiceExternal.Login(String username, String password) in C:\Users\vcaicxz\Desktop\CRYSTAL\PentaDepartureVisionServiceXMLExternaL\NJTTrainData.asmx.cs:line 55 
    at DepartureVisionServiceXMLExternal.ServiceExternal.getTrainScheduleJSON(String station) in C:\Users\vcaicxz\Desktop\CRYSTAL\PentaDepartureVisionServiceXMLExternaL\NJTTrainData.asmx.cs:line 141 
    --- End of inner exception stack trace --- in /home/www/html/njtransit/wed2.php:19 
Stack trace: 
#0 /home/www/html/njtransit/wed2.php(19): SoapClient->__soapCall('getTrainSchedul...', Array) 
#1 {main} 
    thrown in /home/www/html/njtransit/wed2.php on line 19 
+0

“SoapClient”的第二个参数涉及选项,而不是soapheaders。 [看看__setSoapHeaders()](http://www.php.net/manual/en/soapclient.setsoapheaders.php) – Wrikken

+0

@Wrikken所以我需要进行多个调用? – Edward

+0

不,你需要更多的1个功能/方法。这只是一个soapcall .... – Wrikken

回答

3

就快成功了,这一行:

$header = new SoapHeader($ns,'UserCredentials',$soapParameters,false); 

已经创建UserCredentials节点,所以这行:

$soapParameters = array('UserCredentials'=>array('userName' => $username, 'password' => $password)); 

能/应该是:

$soapParameters = array('userName' => $username, 'password' => $password); 

这给你一个反应,因为你的方法调用函数,则有两种可能的方式:

//1. add an extra array around params 
$soapClient->__soapCall($soapFunction, array($soapFunctionParameters)); 
//2. or call like this: 
$soapClient->$soapFunction($soapFunctionParameters); 

(这仍然给我一个空的回应,但我认为那是因为我没有有效凭据,这是一个要注意的事情:我会期望 soaperror/soapfault,但显然这个服务不会产生坏证书他们)。

+0

我试过了,它工作!这是soapParameters中的附加UserCredentials,这是阻止它允许正确登录的主要问题。这对我来说似乎很奇怪,因为我确定我看到很多SOAP登录的例子都是这样做的。再次感谢您抽出宝贵时间查看并提供可行的解决方案,并在第二天按照您的承诺解决问题。 – Edward

+0

另外: $ data_ny = $ soapClient-> getTrainScheduleJSON(array('station'=> $ station)); 做到了。但我喜欢你做$ soapClient的方式 - > $ soapFunction($ soapFunctionParameters);并会改变它。 – Edward