我想寫一些代碼來與SmarterMail API交談,但我似乎無法正確地使PHP格式的請求。的[難看]代碼我迄今爲止是:PHP 5.3 SOAP請求是如何形成的?
<?php
function array_to_params($in_arr) {
$out_arr = array();
foreach($in_arr as $key => $value) {
$out_arr[] = new SoapParam($value, $key);
}
return $out_arr;
}
echo "<pre>";
$soapClient = new SoapClient(
"http://mailserver.net/Services/svcDomainAdmin.asmx?WSDL",
array('trace' => true)
);
var_dump($soapClient->__getTypes());die();
$soap_user_params = array(
'blank' => 'blank', //if I don't have a dummy entry the first parameter doesn't show up.
'AuthUserName' => 'admin',
'AuthPassword' => 'derp'
);
$soap_user_params = array_to_params($soap_user_params);
$error = FALSE;
try {
$info = $soapClient->__soapCall("GetAllDomains", $soap_user_params);
// $info = $soapClient->GetAllDomains($soap_user_params); //same results
} catch (SoapFault $fault) {
$error = TRUE;
printf("Error %s: %s\n", $fault->faultcode, $fault->faultstring);
}
if(!$error) {
var_dump($info);
echo "\nRequest: " . htmlentities($soapClient->__getLastRequest());
}
echo "</pre>";
?>
作爲參考,此功能的WSDL是:
<s:element name="GetAllDomains">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="AuthUserName" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="AuthPassword" type="s:string"/>
</s:sequence>
</s:complexType>
</s:element>
給出的示例請求是:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<GetAllDomains xmlns="http://tempuri.org/">
<AuthUserName>string</AuthUserName>
<AuthPassword>string</AuthPassword>
</GetAllDomains>
</soap:Body>
</soap:Envelope>
但我的代碼生成的請求是:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tempuri.org/">
<SOAP-ENV:Body>
<ns1:GetAllDomains/>
<AuthUserName>admin</AuthUserName>
<AuthPassword>derp</AuthPassword>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
您可以看到由於某些原因,用戶名和密碼參數未包含在GetAllDomains部分中。同樣,在代碼中,您可以看到我必須首先傳遞一個虛擬參數,因爲先發送的內容不會顯示在請求中。另外,我不能簡單地傳入關聯數組,因爲這些鍵不作爲參數名使用,所以它會放入'param1'和'param2'。
我應該注意到,服務器接受請求並吐出關於認證失敗的消息。服務器上有一個內置的SOAP請求測試器,當請求符合給定示例時,它正常工作。
我在PHP文檔中查找的所有內容都是通過Google進行的,似乎表明它不應該這麼難。 :(
任何幫助是極大的讚賞
注意:我在FreeBSD上運行PHP 5.3.8在Apache 2.2,今天建成並通過端口安裝
後的答案編輯:
感謝吉安的回答下面我已經得到了這方面的工作,並大大簡化了代碼:
<?php
echo "<pre>";
$soapClient = new SoapClient("http://mailserver.net/Services/svcDomainAdmin.asmx?WSDL", array('trace' => true));
$soap_user_params = array(
'AuthUserName' => 'admin',
'AuthPassword' => 'derp'
);
try {
$info = $soapClient->__soapCall("GetAllDomains", array('parameters' => $soap_user_params));
var_dump($info);
echo "\nRequest:\n" . htmlentities($soapClient->__getLastRequest());
} catch (SoapFault $fault) {
printf("Error %s: %s\n", $fault->faultcode, $fault->faultstring);
}
echo "</pre>";
[從PHP消費到.NET SOAP服務與認證]的可能重複(http://stackoverflow.com/questions/7959798/consuming-to-a-net-soap-service -from-php-with-authentication) – Gian
@Gian我真的沒有看到連接。盡我所能告訴他的問題是使用SOAP頭,但是這個應用程序甚至不需要頭部分。 在這個低音API中,用戶名和密碼作爲參數發送給每個需要認證的函數[也就是每個函數],而不是作爲頭文件的一部分。 – Sammitch