Amazon AWS SQS WSDL ( https://sqs.us-east-1.amazonaws.com/doc/2009-02-01/QueueService.wsdl ) には、異なる「アドレス」を持つ複数の「ポート」がリストされています (このファイルは、サービスの HTTP および HTTPS アドレスを指定します。
PHP SOAP オブジェクトの使用:
$aws_ns = 'http://security.amazonaws.com/doc/2007-01-01/';
$sc = new SoapClient('https://sqs.us-east-1.amazonaws.com/doc/2009-02-01/QueueService.wsdl');
$sc->__setSoapHeaders(new SoapHeader($aws_ns, 'AWSAccessKeyId', 'MyAccessKey'));
$action = "ListQueues";
$ts = date('c');
$hash = base64_encode(hash_hmac('sha1', $action.$ts, 'MyPrivateKey', true));
try {
$rs = $sc->__soapCall($action, array(), NULL, array(
new SoapHeader($aws_ns, 'Signature', $hash),
new SoapHeader($aws_ns, 'Timestamp', $ts)
));
} catch (SoapFault $f) {
echo "ERROR: ".$f->faultcode."-".$f->faultstring."\n";
}
そのコードを実行すると、「エラー: aws:Client.RequiresSSL-SSL 接続が下位互換性のある SOAP 認証に必要です。」と表示されます。最初の「ポート」(HTTP ポート) を使用して AWS サービスに接続していますが、これはこの種の認証では許可されていません。
$sc->__setLocation('https://queue.amazonaws.com');
の前に (WSDL ファイルから URL をコピーして貼り付けた) 行を追加すると__soapCall
、問題なく動作しますが、SoapClient オブジェクトに、静的文字列として渡すのではなく、WSDL で他のポートを使用するように指示するにはどうすればよいですか?途中で HTTPS URL を変更した場合はどうなりますか?