Object reference not set to an instance of an object error when trying SOAP call

我的未来我决定 提交于 2019-12-21 05:17:05

问题


I am trying to connect to and authenticate with a webservice using SOAP / wsdl, but I constantly get the error:

<b>Fatal error</b>:  Uncaught SoapFault exception: [a:InternalServiceFault] Object reference not set to an instance of an object. in /path/install.php:16

Below is my current code:

<?php
header("Content-Type: text/plain"); 

$userinfo = array(
    'Username'=>'test',
    'Password'=>'test'
);

$wsdl_url = 'https://ws-e-distribution.kmd.dk/standard/ServiceAutorisation/ServiceAutorisation.svc?wsdl';
$client = new SoapClient($wsdl_url);

print_r($client->__getFunctions());
print_r($client->__getTypes());

//This is the problematic line:
$response = $client->__soapCall('LogOn', array('LogOn' => $userinfo));

var_dump($response);

I have tried every possible way of wrapping the username and password parameters that I could conceive of or find anyone suggesting:

  • using a custom class
  • using a stdClass
  • using SoapVar
  • using SoapParam
  • using a simple array
  • double wrapped array
  • A lot of combinations of the above.

And I've tried calling the function like $client->__soapCall('LogOn', [milliontries]) as well as $client->LogOn([milliontries])

...nothing works, please help.

Update:

I finally managed to get a different error (that suggests at least I hit upon something slightly less wrong). My code now looks like this:

$response = $client->LogOn(array('logon' => array('Username' => 'test','Password' => 'test')));

Which gives me an error about the LogOnType being unsupported (in Danish, which suggests to me that at least I have some sort of connection to the server now). The username and password array has no effect, I can substitute an empty string and get the same result, the thing that makes the difference is the lowercase logon.

If anyone can set up a working example that gives the error incorrect username or password I will be forever grateful... but any pointers will be much appreciated.

As far as I understand the wsdl gives all the information needed to do this, I'm just too much of a [your_pick] to get it...?


回答1:


Unbelievable ! It only took nine hours to write these 16 lines of code.

<?php
header("Content-Type: text/plain"); 

$userinfo = array(
    'Username'=>'test',
    'Password'=>'test'
);

$wsdl_url = 'https://ws-e-distribution.kmd.dk/standard/ServiceAutorisation/ServiceAutorisation.svc?wsdl';
$client = new SoapClient($wsdl_url, array('trace' => 1, "exception" => 0));

print_r($client->__getFunctions());
print_r($client->__getTypes());

//This actually works ! :) :) :)
$response = $client->LogOn(array('logon' => new SoapVar($userinfo, SOAP_ENC_OBJECT, 'LogOnUsername', 'http://schemas.datacontract.org/2004/07/WebServiceAutorisation.BL')));

var_dump($response);

I was so close several times, and it turned out the namespace (the URL) was the magic bit I was missing. I had been using the namespace from the main wsdl (or no namespace at all) in every attempt at using SoapVar's.

Well now, on to the actual purpose of logging in, probably won't be any easier



来源:https://stackoverflow.com/questions/24574716/object-reference-not-set-to-an-instance-of-an-object-error-when-trying-soap-call

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!