[英]PHP SoapClient when dealing with a WSDL based server
I am trying to figure out how to deal with a WSDL in PHP using SoapClient and I am getting the dreaded: 我试图弄清楚如何使用SoapClient处理PHP中的WSDL,但我感到恐惧:
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;
}
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.
这个问题有两个方面,身份验证不起作用,WSDL期望使用数组而不是对象。 The key to getting it working was to echo the __getLastRequest() XML it was producing.
使它工作的关键是回显正在生成的__getLastRequest()XML。
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: 这是它生成的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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.