2012-01-18 18 views
1

私はPHPでSOAPリクエストを作成しようとしています。私の要求は、SOAPサーバのドキュメントに記載されているリクエストと一致しているようですが(少し違いますが)、ヘッダーが含まれていないかのように認証エラーが発生しています。SOAP要求が機能しないのはなぜですか?

ドキュメントの要求サンプル

<?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:Header> 
    <AuthHeader xmlns="http://novosolutions.com/"> 
     <SessionId>string</SessionId> 
    </AuthHeader> 
    </soap:Header> 
    <soap:Body> 
    <ViewTicket xmlns="http://novosolutions.com/"> 
     <Id>int</Id> 
    </ViewTicket> 
    </soap:Body> 
</soap:Envelope> 

要求私のPHPコードの出力:

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://novosolutions.com/"> 
    <SOAP-ENV:Header> 
     <ns1:AuthHeader> 
      <SessionId>623</SessionId> 
     </ns1:AuthHeader> 
    </SOAP-ENV:Header> 
    <SOAP-ENV:Body> 
     <ns1:ViewTicket> 
      <Id>1355110</Id> 
     </ns1:ViewTicket> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

私のPHPコードはかなり単純です。私は何か間違っているのですか?

$url = URL_BASE . URL_TICKET . '?WSDL'; 
$soapStruct = new SoapVar(array('SessionId' => SESSION_ID), SOAP_ENC_OBJECT); 
$header = new SoapHeader('http://novosolutions.com/', 'AuthHeader', $soapStruct, false); 

try { 
    $client = new SoapClient($url, array('trace' => 1)); 
} 
catch (SoapFault $exception) { 
    echo 'Exception='.$exception; 
} 
$client->__setSoapHeaders(array($header)); 
var_dump($client); 

$soapData = new SoapVar(array('Id' => 1355110), SOAP_ENC_OBJECT); 
$result = $client->__soapCall('ViewTicket', array('parameters' => $soapData)); 

var_dump($result); 
echo $client->__getLastRequest(); 

EDIT:カールとの要求をテストすることにより 、私はPHPののSoapClientは、名前空間の変数を使用しているという事実にそれを絞り込むました。 SoapServerでは受け入れられませんが、これで、SoapClientが変数を使用しないようにする方法を理解する必要があります。

+0

解決策はまだ見つかりませんか?私は正確な問題を持っています。 – slhsen

+0

はい - セッションIDに間違った#が含まれていました。セッションIDはレスポンスヘッダではなく、レスポンスボディにあります。それを取得するには、$ responseHeaders = array();を使用します。$ result = $ client - > __ soapCall( 'Login'、array( 'parameters' => $ bodyVar)、null、null、$ responseHeaders); $ sessionid = $ responseHeaders ['AuthHeader'] - > SessionId; –

答えて

0

これは簡単に試しましたか?

error_reporting(E_ALL); 
$client = new SoapClient($url,array('trace' => 1)); 
$client->__setSoapHeaders(new SoapHeader($url, 'SessionId', SESSION_ID)); 
$result = $client->ViewTicket(array('Id'=>1355110)); 
var_dump($result); 
echo '<hr>',str_replace('<','&lt;',$client->__getLastRequest()); 

どのようなエラーメッセージが表示されますか?

+0

あなたの返事をありがとう。 PHPエラーなし - 結果は同じです(認証エラーまたはセッションが期限切れです)。結果:http://codepad.org/EbQnxKO3 –

+0

私はsoapUIソフトウェア(http://www.soapui.orgから無料で入手できます)で同じリクエストを試してみます。同じ結果が得られました(認証エラーまたはセッションが期限切れです)。 ..資格情報を必要としないと確信していますか? (ユーザー/ pwd HTTPヘッダーのような)? – sly63

+0

PHPのSoapClientが名前空間に変数を使用しないようにする方法を知っていますか?

関連する問題