我正在使用 SOAP 从第 3 方获取和更新数据,但在通过 __setSoapHeaders 设置连接时设置命名空间时遇到问题。
这是我的代码(示例):
$ns = "http://wms.website.net/";
$clientid = "123";
$username = "username";
$password = base64_encode("password");
$socket_context = stream_context_create(array('http' => array('protocol_version' => 1.0)));
$client = new SoapClient("http://website.net/$clientid/resources/integrationservicev4.asmx?WSDL", array('exceptions' => 0,'stream_context' => $socket_context,'trace' => 1));
$params = array("clientId"=>$clientid,"username"=>$username,"password"=>$password);
$start = $client->Authenticate($params);
if (is_soap_fault($start)) {
trigger_error("SOAP Fault: (faultcode: {$start->faultcode}, faultstring: {$start->faultstring})", E_USER_ERROR);
print "<br />";
} else {
$response = $start->AuthenticateResult->Detail;
$response_explode = explode(",",$response);
$sessionid = $response_explode[1];
//Body of the Soap Header.
$headerbody = array('ClientId' => $clientid, 'SessionId' => $sessionid);
//Create Soap Header.
$header = new SOAPHeader($ns, 'UserSessionCredentials', $headerbody);
//set the Headers of Soap Client.
$client->__setSoapHeaders($header);
}
我连接正常并获取会话 ID,这很棒。但是,每当我调用 API 时,都会被告知我的会话 ID 无效。进一步查看,我可以看到 SOAP 请求中有两个命名空间,并且只有 ns2 是 $ns 的值:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.website.net/" xmlns:ns2="http://wms.website.net/">
<SOAP-ENV:Header>
<ns2:UserSessionCredentials>
<item>
<key>ClientId</key>
<value>cls22754</value>
</item>
<item>
<key>SessionId</key>
<value>4b62f147-0277-4f2f-be45-005fed25e6db</value>
</item>
</ns2:UserSessionCredentials>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<ns1:SaveData>
<ns1:saveRequest>
<ns1:TemplateName>Sales orders</ns1:TemplateName>
<ns1:CsvData>SalesOrderNumber,ShippingCost,TotalSale,CreatedDate
123,1.00,49,2015-10-08 12:16:06
456,1.00,100,2015-10-08 18:13:36
789,0.00,16.50,2015-10-08 18:52:12</ns1:CsvData>
<ns1:Action>0</ns1:Action>
</ns1:saveRequest>
</ns1:SaveData>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
如何将 ns1 更改为与 ns2 相同的命名空间?