0

I am trying to figure out how to deal with a WSDL in PHP using SoapClient and I am getting the dreaded:

SoapFault exception: [soap:Server] Server was unable to process request. ---> Object reference not set to an instance of an object.

Here is the function I am trying to use:

CheckInventoryResponse CheckInventory(CheckInventory $parameters)

The struct:

string(47) "struct CheckInventory {
   InventoryRequest ir;
}"

What I trying to do:

class PhpCheckInventory {
    public $ir;
}

$client = new SoapClient($wsdl);
$header = new SOAPHeader($wsdl, 'Authentication', array('Username' => $username, 'Password' => $password));
$client->__setSoapHeaders($header);

try {
    $parameter1 = new PhpCheckInventory();
    $parameter2 = new SoapParam($parameter1, 'CheckInventory');
    $result = $client->CheckInventory($parameter2);
} catch (SoapFault $exception) {
    echo $exception;      
}
1
  • is CheckInventory expecting an object of type PhpCheckInventory? In that case you should pass $parameter1 to the CheckInventory function and not $parameter2. Commented Oct 3, 2013 at 2:58

1 Answer 1

1

I ended up getting it working. The problem was two-fold, the Authentication wasn't working and the WSDL was expecting arrays instead of objects. The key to getting it working was to echo the __getLastRequest() XML it was producing.

Here is the code:

<?php
ini_set('display_errors', true); 
ini_set("soap.wsdl_cache_enabled", "0"); 
error_reporting(E_ALL);

// ns, wsdl, username, password goes here.

$client = new SoapClient($wsdl, array('trace' => 1, 'exceptions' => 0));
$auth = new stdClass();
$auth->Username = $username;
$auth->Password = $password;
$header = new SOAPHeader($ns, 'Authentication', $auth, false);
$client->__setSoapHeaders($header);

echo "Display Funcs\n";
var_dump($client->__getFunctions()); 
echo "Diaplay Types\n";
var_dump($client->__getTypes()); 

try {
    $partIds = array('PartId' => "name");
    $parts = array('Part' => $partIds);
    $partList = array('PartList' => $parts);
    $response = $client->CheckInventory(array('ir' => $partList));
    echo $client->__getLastRequest() . "\n";
    var_dump($response);
} catch (SoapFault $exception) {
    echo $exception;      
}
?>

Here is the XML it produces:

<SOAP-ENV:Envelope 
    xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:ns1="removed">
    <SOAP-ENV:Header>
        <ns1:Authentication>
            <ns1:Username>name</ns1:Username>
            <ns1:Password>pass</ns1:Password>
        </ns1:Authentication>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body>
        <ns1:CheckInventory>
            <ns1:ir>
                <ns1:PartList>
                    <ns1:Part>
                        <ns1:PartId>name</ns1:PartId>
                    </ns1:Part>
                </ns1:PartList>
            </ns1:ir>
        </ns1:CheckInventory>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.