2010-07-21 2 views
2

Amazon AWS SQS WSDL (https://sqs.us-east-1.amazonaws.com/doc/2009-02-01/QueueService.wsdl)은 서비스의 HTTP 및 HTTPS 주소를 지정하는 "주소"가 다른 여러 "포트"(파일의 맨 아래)를 나열합니다. PHP는 SOAP 객체 사용PHP의 SOAP WSDL에서 다른 포트를 선택하는 방법은 무엇입니까?

: ": AWS : ERROR를 Client.RequiresSSL SSL 연결은 이전 버전과 호환 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"; 
} 

준다; 첫 번째 "포트"(HTTP 하나)를 사용하여 AWS 서비스에 연결합니다. 이러한 종류의 인증에는 허용되지 않습니다.

__soapCall 앞에 $sc->__setLocation('https://queue.amazonaws.com'); (URL 복사 및 붙여 넣기 된 URL) 행을 추가하면 올바르게 작동하지만 SoapClient 객체가 WSDL에서 다른 포트를 사용하도록 지시 할 수 있습니까? HTTPS URL을 변경하는 경우를 대비하여 정적 문자열로 사용 하시겠습니까?

답변

1

내가 아는 한, SoapClient가 다른 것을 사용하도록 알리는 간단한 방법은 없습니다. 단지 httphttps에 변화를 만들 수 있고, 다른 모든 조건이 동일한 경우, 당신은 당신의 자신의 클래스와 몇 가지 메소드를 오버라이드 (override) 있습니다 방법이 다른 경우

class HttpsPortSoapClient extends Soapclient { 
    function __doRequest($request,$location,$action,$version,$one_way = 0){ 
    $locationparts = parse_url($location); 
    if(isset($locationparts['scheme']) && $locationparts['scheme'] == 'http'){ 
     if(function_exists('http_build_url')){ 
     $location = http_build_url($locationparts,array('scheme'=>'https')); 
     } else { 
     //the long way around: 
     $location = 'https://'; 
     if(isset($locationparts['user'])){ 
      $location .= $locationparts['user']; 
      if(isset($locationparts['pass']))$location .= ':'.$locationparts['pass']; 
      $location .= '@'; 
     } 
     if(isset($locationparts['host'])) $location .= $locationparts['host']; 
     if(isset($locationparts['port'])) $location .= ':'.$locationparts['port']; 
     if(isset($locationparts['path'])) $location .= $locationparts['path']; 
     if(isset($locationparts['query'])) $location .= '?'.$locationparts['query']; 
     } 
    } 
    return parent::__doRequest($request,$location,$action,$version,$one_way); 
    } 
} 

, 당신은 __construct 메소드를 오버라이드 (override) 할 수 있습니다 XML을로드하고 'https'대신 'http'포트에 대한 참조를 정리하거나 제거하십시오. 그것은 점점 더 자신의 soapclient 쓰기처럼 보이게 될 것이다 :)

관련 문제