1

以下のURLに記載されている例を使用してみました。しかし、ここで $wrapper をどのように構築しているのか混乱しました。ラッパーを作成する方法と、その内容を教えてください。 http://www.sis.utoronto.ca/web_services/code_samples.html .

wsseを初めて使用するので、使用方法がわからないので、誰かがここで私を助けてくれますか? PHP から .net wsse への SOAP 呼び出しを行っています。

この例でヘッダーを渡す方法を教えてください。

<?php
  class WSSESoapClient extends SoapClient {                                                                                           
protected $wsseUser;
protected $wssePassword;

public function setWSSECredentials($user, $password) {
    $this->wsseUser = $user;
    $this->wssePassword = $password;
}

public function __doRequest($request, $location, $action, $version, $one_way = 0) {
    if (!$this->wsseUser or !$this->wssePassword) {

        return parent::__doRequest($request, $location, $action, $version, $one_way = 0);
    }

    // get SOAP message into DOM
    $dom = new DOMDocument();
    $dom->loadXML($request);
    $xp = new DOMXPath($dom);
    $xp->registerNamespace('SOAP-ENV', 'http://schemas.xmlsoap.org/soap/envelope/');

    // search for SOAP header, create one if not found
    $header = $xp->query('/SOAP-ENV:Envelope/SOAP-ENV:Header')->item(0);
    if (!$header) {
        $header = $dom->createElementNS('http://schemas.xmlsoap.org/soap/envelope/', 'SOAP-ENV:Header');
        $envelope = $xp->query('/SOAP-ENV:Envelope')->item(0);
        $envelope->insertBefore($header, $xp->query('/SOAP-ENV:Envelope/SOAP-ENV:Body')->item(0));
    }

    // add WSSE header
    $usernameToken = $dom->createElementNS('http://schemas.xmlsoap.org/ws/2002/07/secext', 'wsse:UsernameToken');
    $username = $dom->createElementNS('http://schemas.xmlsoap.org/ws/2002/07/secext', 'wsse:Username', $this->wsseUser);
    $password = $dom->createElementNS('http://schemas.xmlsoap.org/ws/2002/07/secext', 'wsse:Password', $this->wssePassword);
    $usernameToken->appendChild($username);
    $usernameToken->appendChild($password);
    $header->appendChild($usernameToken);

    // perform SOAP call
    $request = $dom->saveXML();

    return parent::__doRequest($request, $location, $action, $version, $one_way = 0);
}

  } // class WSSESoapClient

  $wsdl = 'Mywsdlurl';
  $sClient = new WSSESoapClient ($wsdl,array( "trace" => 1 ));


    $sClient->setWSSECredentials('username', 'password');

    $wrapper->AccountName = new SoapVar("NEw User", XSD_STRING);
    $wrapper->AccountInfo->propertyID = new SoapVar(2, XSD_STRING);


    try {
$result = $sClient->CreateAccount($wrapper);    
print_r($result);
} catch (SoapFault $fault) {
print("Fault string: " . $fault->faultstring . "\n");
print("Fault code: " . $fault->detail->WebServiceException->code . "\n");
}

echo $sClient->__getLastRequest();
 // "<br>" .
//  $sClient->__getLastResponse();

?>

__getLastRequest を確認すると、_doRequest で定義されたヘッダーが添付されていません。

私がここで何をしているのか教えてください。

4

1 に答える 1

0

Skillsofts OLSA Web サービスと統合する Moodle モジュールで、PasswordDigest を使用して UserNameToken を実装しました。

見てみましょう: http://code.google.com/p/moodle2-skillsoft-activity/source/browse/trunk/skillsoft/olsalib.php#40

これは、パスワード ダイジェストを含む UserNameToken の送信をサポートするために PHP SoapClient のラッパーを作成する場所です。これを微調整して、プレーン パスワードなどを実行できます。

これには、使用するプロキシなどを取得するための Moodle 固有のコードと、ファイルシステム上の WSDL を「キャッシュ」する場所があります (クライアントを設定するたびに WSDL をプルダウンするよりも、クライアントの設定を高速化します)。

次に見てください: http://code.google.com/p/moodle2-skillsoft-activity/source/browse/trunk/skillsoft/olsalib.php#483

Web サービスの 1 つを呼び出すと、クライアントがどのようにセットアップされ、ユーザー名とパスワードがどのように渡されるかを確認できます。

于 2012-10-23T14:12:01.683 に答える