2017-05-14 5 views
0

나는 서버에 PHP와 SOAP 요청을하려고하지만, 내가 갖는 모든 내가 WSDL 잘 생각 PHP에서 비누를 디버깅하는 방법?

$this->client->__soapCall("aMethod()", [$request_param_array])); 

를 실행할 때 내가 도달 할 수 있기 때문에, "호스트에 연결할 수 없습니다 '입니다 그것은 내 브라우저에서 (이 WSDL에 지정된대로) 내가 사용할 수있는 기능의 목록을 받는가

$this->client->__getFunctions(); 

를 실행하는 경우.

내가, 해당 서버에 SOAP 호출을 할 수있는 인증서가 필요하지 어쩌면 그건 문제는?하지만 어떻게 디버깅 할 수 있는지 모르겠다. 이 "호스트에 연결할 수 없습니다"오류가 발생합니다.

어떤 아이디어로 인해이 오류가 발생할 수 있습니까? 또는 어떻게 문제를 찾을 수 있습니까? 지금까지

내 코드 :

public function __construct($url, $wsdl = null) 
{ 
    $this->wsdl = $wsdl != null ? $wsdl : $url . '?wsdl'; 

    $this->client = new SoapClient($this->wsdl, array(
     "trace" => "1", 
     "local_cert" => realpath(__DIR__ . DIRECTORY_SEPARATOR . ".." . DIRECTORY_SEPARATOR . ".." . DIRECTORY_SEPARATOR . "..") . "cert.pfx", 
     "passphrase" => "admin", 
    )); 
    Log::info(sprintf("New SoapClient created with WSDL: '%s'", $this->wsdl)); 
} 

답변

0

나는이 SOAP 관련 문제 주위에 조금 더 디버깅 할 나중에 SoapUI을 사용했습니다. SoapUI가 나에게 'SSL 핸드 셰이크'예외를주었습니다. 그것은 연결하고 있던 SOAP 서버의 공개 키 인증서와 일치하지 않는 잘못된 개인 키 인증서로 밝혀졌습니다.

비록 PHP에서 이와 같은 문제를 어떻게 디버깅 할 수 있는지 아직 알지 못합니다. 어떤 아이디어? 알려줘.

0

SOAP 요청을 디버그하는 가장 쉬운 방법은 SoapClient 클래스의 다음 기능을 사용하여 웹 서비스 또는 웹 서비스 클라이언트에서 원시 SOAP 요청과 원시 SOAP 응답을 기록하는 SOAP extension (주석 참조)을 만드는 것입니다.

SoapClient::__getLastRequestHeaders 
SoapClient::__getLastRequest 
SoapClient::__getLastResponseHeaders 
SoapClient::__getLastResponse 

설정하면 추적 옵션을 사용하여 SoapClient 객체를 생성해야합니까, 그것이 작동하기 위해, 잊지 마세요 :

$client = new MySoapClient($wsdlUrl, array('trace' => 1)); 

PHP에서 SOAP 솔루션을 개발 추가 팁을 청소하는 것입니다 tmp 폴더에 W가있을 때 SDL 계약 변경 (phpinfo()의 tmp 폴더 경로 참조)을 사용하여 PHP SoapClient가 캐시 된 파일을 사용하여 WSDL 및 XSD 파일을 다시 다운로드하도록합니다 (만료 될 때까지).

SoapUI 외에도 here과 같이 Charles와 같은 중간 추적 프록시를 사용할 수도 있습니다. 이 효율적인 방법의 단점은 더 많은 레이어를 추가하므로 새로운 문제가 발생할 가능성이 있다는 것입니다.

유효성 검사 및 호출을 수행하는 XML Spy SOAP Debugger 또는 SOAPSonar과 같이 돈을 가치가있는 상용 SOAP 디버거가 있습니다. 어쨌든, SoapUI는 항상 좋은 동반자입니다.

기본 오류 정보는 PHP 로그와 웹 서버 로그에서도 찾을 수 있습니다. 전체/일반 텍스트 로깅을 사용하도록 설정했는지 확인하십시오.

+0

의견을 보내 주셔서 감사합니다. 나는 실제로 이러한 솔루션을 찾았지만 디버깅의 단점은 실제 요청 이전에 인증서 오류가 발생한다는 것입니다. 그래서 어떤 종류의 연결 실패가있을 때 getLastResponse()의 getLastRequest()를 사용할 수 없습니다. – Kevin