2011-11-24 37 views
1

我想寫一些代碼來與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>"; 
+0

[從PHP消費到.NET SOAP服務與認證]的可能重複(http://stackoverflow.com/questions/7959798/consuming-to-a-net-soap-service -from-php-with-authentication) – Gian

+0

@Gian我真的沒有看到連接。盡我所能告訴他的問題是使用SOAP頭,但是這個應用程序甚至不需要頭部分。 在這個低音API中,用戶名和密碼作爲參數發送給每個需要認證的函數[也就是每個函數],而不是作爲頭文件的一部分。 – Sammitch

回答

1

我的AP關於錯誤指導的關閉。我誤解了你最初想做的事情。

通過soapCall文檔評論篩選,有幾件事我建議嘗試。首先,這:

$soap_user_params = array(
    'parameters' => array (
     'AuthUserName' => 'admin', 
     'AuthPassword' => 'derp' 
    ) 
); 

顯然你的參數需要是關鍵'參數'的關聯數組中的一個元素。奇怪,是吧?

如果不這樣做,您可能需要將它嵌套得更深! _數組條目似乎沒有記錄在任何明顯的位置,但這似乎是PHP文檔中的評論者所暗示的內容。因此,也許這樣的:

$soap_user_params = array(
    'parameters' => array (
     'AuthUserName' => array('_' => 'admin'), 
     'AuthPassword' => array('_' => 'derp') 
    ) 
); 
+0

嵌套在'parameters'數組中已經完成了這個訣竅,儘管我仍然爲什麼這是必要的而感到困惑。我也嘗試過'_'數組,但它們不起作用。 我相信我在'soapCall'文檔頁面找到了[http://www.php.net/manual/en/soapclient.soapcall.php#89308](您提到的評論),這似乎暗示了這與SOAP服務器是.NET有關。 GDI MS! \ * rantrantrant \ *。 – Sammitch