0

SoapClient を使用して PHP で WSDL を処理する方法を理解しようとしています。

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

これが私が使用しようとしている機能です:

CheckInventoryResponse CheckInventory(CheckInventory $parameters)

構造体:

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

私がやろうとしていること:

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;      
}
4

1 に答える 1

1

私はそれを機能させることになりました。問題は 2 つあります。認証が機能していないことと、WSDL がオブジェクトではなく配列を予期していたことです。それを機能させるための鍵は、それが生成していた __getLastRequest() XML をエコーすることでした。

コードは次のとおりです。

<?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;      
}
?>

生成される XML は次のとおりです。

<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>
于 2013-10-03T13:40:11.883 に答える