php
  • soap
  • ws-security
  • 2012-02-08 149 views 3 likes 
    3

    在基本的PHP/SOAP設置中遇到問題PHP SOAP函數調用返回錯誤

    我在PHP中編寫SOAP客戶端以與現有SOAP服務器進行通信。它也使用WS-Security。

    我已經成功地能夠連接(認證),並作出__getFunctions調用,它返回使用下面的代碼可用功能的數組:

    <?php 
    
    $wsdlPath = "https://xxx.xxx.xxx.xxx/services/Service?wsdl"; 
    
    $ns = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'; 
    $token = new stdClass; 
    $token->Username = new SOAPVar('xUSERx', XSD_STRING, null, null, null, $ns); 
    $token->Password = new SOAPVar('xPASSx', XSD_STRING, null, null, null, $ns); 
    
    $wsec = new stdClass; 
    $wsec->UsernameToken = new SoapVar($token, SOAP_ENC_OBJECT, null, null, null, $ns); 
    
    $headers = new SOAPHeader($ns, 'Security', $wsec, true); 
    
    if (!$client) 
    { 
        $client = new SoapClient($wsdlPath); 
        echo "Conn:YES"; 
    } 
    else 
    { 
        echo "Conn:NO"; 
    } 
    
    $client->__setSOAPHeaders($headers); 
    
    try 
    { 
        print_r($client->__getFunctions());  
    } 
    catch (SoapFault $exception) 
    { 
        print($exception); 
    } 
    
    ?> 
    

    這給下面的輸出(凌亂,但你這個想法):

    Conn:YES 
    Array (
        [0] => editChannelResponse editChannel(editChannel $parameters) 
        [1] => getDownloadTokenResponse getDownloadToken(getDownloadToken $parameters) 
        [2] => startCallResponse startCall(startCall $parameters) 
        [3] => getCallsResponse getCalls(getCalls $parameters) 
        [4] => endCalendarCallResponse endCalendarCall(endCalendarCall $parameters) 
        [5] => createChannelResponse createChannel(createChannel $parameters) 
        [6] => getArchivesByCallIdsResponse getArchivesByCallIds(getArchivesByCallIds $parameters) 
        [7] => getChannelsResponse getChannels(getChannels $parameters) 
        [8] => createVRRResponse createVRR(createVRR $parameters) 
        [9] => getTemplateResponse getTemplate(getTemplate $parameters) 
        [10] => getTemplatesResponse getTemplates(getTemplates $parameters) 
        [11] => getCallsByStatusResponse getCallsByStatus(getCallsByStatus $parameters) 
        [12] => getCallResponse getCall(getCall $parameters) 
        [13] => startCalendarCallResponse startCalendarCall(startCalendarCall $parameters) 
        [14] => deleteChannelResponse deleteChannel(deleteChannel $parameters) 
        [15] => editVRRResponse editVRR(editVRR $parameters) 
        [16] => deleteVRRResponse deleteVRR(deleteVRR $parameters) 
        [17] => getLiveStreamingsResponse getLiveStreamings(getLiveStreamings $parameters) 
        [18] => getHashedPasswordResponse getHashedPassword(getHashedPassword $parameters) 
        [19] => getVersionResponse getVersion(getVersion $parameters) 
        [20] => endCallResponse endCall(endCall $parameters) 
        [21] => getVRRsResponse getVRRs(getVRRs $parameters) 
        [22] => getNumberOfArchivesResponse getNumberOfArchives(getNumberOfArchives $parameters) 
        [23] => getArchivesResponse getArchives(getArchives $parameters) 
        [24] => getVRRResponse getVRR(getVRR $parameters) 
    ) 
    

    但是,當我嘗試調用的上市功能直接(getVersion),一個通過更換

    print_r($client->__getFunctions()); 
    

    print_r($client->getVersion()); 
    

    我收到以下錯誤

    Conn:YES 
    SoapFault exception: [soap:Server] 
    Fault occurred while processing. in /var/data/www/xxx/beta/soap.php:29 
    Stack trace: #0 [internal function]: SoapClient->__call('getVersion', Array) #1 
    /var/data/www/xxx/beta/soap.php(29): SoapClient->getVersion() #2 {main} 
    

    我沒有看到錯誤消息的任何有用的信息,而我打電話的功能是列出的可用選項之一,我相信我的語法是正確的。

    +0

    soap.php的第29行是什麼? – 2012-02-08 13:28:08

    +0

    第29行是我對print_r($ client-> getVersion())進行更改的關鍵線路; – 2012-02-08 13:32:24

    +0

    有沒有更多的堆棧跟蹤? – 2012-02-08 13:37:48

    回答

    0

    你可以嘗試用選項給init SoapClient的:

    $client = new SoapClient($wsdlPath, array("trace" => true, "exceptions" => true)); 
    

    如果例外是

    • true,任何錯誤都將引發Exception
    • false,您將收到一個包含soapFault消息的$client對象。
    +0

    我不確定這會有幫助,因爲他在調用由其SOAP偵聽器提供的「可用」函數時收到錯誤。 – 2012-02-08 13:34:24

    +0

    添加該參數對輸出沒有影響。 – 2012-02-08 13:35:25

    +0

    你有沒有試過用參數調用getVersion,甚至是空參數? – 2012-02-08 13:39:11

    1

    你可以嘗試'手動'調用該函數的調用嗎?

    $response = $client->__doRequest($postdata, 'soaplistenerurl', 'getVersion', 1); 
    

    這是什麼產量?

    +0

    $ postdata的值是多少?對不起,這是我第一次使用SOAP,因此對我來說這是陌生的領域。 – 2012-02-08 13:50:51

    +0

    你可以在裏面放一個空的XML。所以''進行測試。不用擔心,如果您以前沒有使用SOAP,那麼SOAP可能會成爲一個怪物,尤其是如果您對一般Web服務不熟悉,尤其如此 – 2012-02-08 13:51:55

    +0

    這看起來似乎沒有產生任何輸出。 – 2012-02-08 13:57:21

     相關問題

    • 暫無相關問題^_^