2013-06-12 3 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 

Вот еще одна попытка добавления SoapHeader перед __setSoapHeaders. Я также добавил пространство имен ($ нс):

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' относится к вариантам, а не к мылам. [загляните в __setSoapHeaders()] (http://www.php.net/manual/en/soapclient.setsoapheaders.php) – Wrikken

+0

@Wrikken Итак, мне нужно сделать несколько звонков? – Edward

+0

Нет, вам нужно больше 1 функции/метода. Это всего лишь 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

Я пробовал это, и это сработало !!! Это были дополнительные UserCredentials в soapParameters, что стало основной проблемой, препятствующей правильному вводу в систему. Это кажется мне таким странным, потому что я уверен, что я видел множество примеров входа SOAP в этот путь. Еще раз спасибо за то, что нашли время, чтобы посмотреть на это, и предложить приемлемое решение и вернуться на следующий день, чтобы решить это, как вы и обещали. – Edward

+0

Также: $ data_ny = $ soapClient-> getTrainScheduleJSON (array ('station' => $ station)); сделал трюк. Но мне нравится, как вы делали $ soapClient -> $ soapFunction ($ soapFunctionParameters); и изменит его на это. – Edward

Смежные вопросы