2011-02-10 14 views
4

この問題は、1日中私を殺しています。Soapクライアント、基本HTTP認証でHTTPS経由で関数を呼び出す方法

私はクライアントのWebサービスのhttps持って:私は、Webサービスに接続するためにSOAPUIを使用する場合は、すべてがエラーなしで完璧に動作します。..基本HTTP認証で、

を// *の.asmx WSDL?を全く...(私はPHPを使用しています、私はPHPに切り替えたときに問題がある

...

は、私はそれに接続するために管理され、私は、PHPのためのSoapClient拡張子を使用してサーバからの機能のリストを取得することができます5.3.0)。

私はPHPのためのSoapClient拡張子を使用して関数を呼び出すようにしようとすると、私は次のエラーを取得:

Fatal error: Uncaught SoapFault exception: [HTTP] Error Fetching http headers in C:\www\xpto_Atestes\soapclient.php:26 Stack trace: #0 [internal function]: >SoapClient->__doRequest('***...', 'http://****...', 1, 0) #1 >C:\www\xpto_Atestes\soapclient.php(26): SoapClient->__soapCall('login', Array) #2 {main} >thrown in C:\www\xpto_Atestes\soapclient.php on line 26

より明確なエラー(私はコールの結果をしますprint_rを行う):

を送信されている次のヘッダーで

[faultstring] => Error Fetching http headers
[faultcode] => HTTP

POST /*.asmx HTTP/1.1 Host: *.pt Connection: Keep-Alive User-Agent: >PHP-SOAP/5.3.0 Content-Type: text/xml; charset=utf-8 SOAPAction: "http://**/Login" >Content-Length: 264 Authorization: Basic AUTHSECRETPASS

が、私はこのようにそれを呼んでいます。

Error

HTTP Error: socket read of headers timed out

Request

POST /**.asmx HTTP/1.0 Host: *.pt User-Agent: NuSOAP/0.9.5 (1.123) Content-Type: text/xml; charset=ISO-8859-1 SOAPAction: "http://****/Login" Authorization: Basic AUTHSECRETPASS Content-Length: 481

NUMBERPASSWORD

Response

私はそれを呼んでいる:

$soapParams = array('login' => 'HTTP_LOGIN',
'password' => 'HTTP_PASS',
'authentication' => SOAP_AUTHENTICATION_BASIC,
'trace' => 1,
'exceptions' => 0
);
$client = new SoapClient("https://****.asmx?WSDL", $soapParams); echo "Connected
"; $params = array('account' => '', 'msisdn'=>'NUMBER', 'password'=>'PASSWORD'); $result = $client->__soapCall("login", $params);

しばらくはグーグルで、問題が何ができるかを調べるために試みた後、私は...私の悲惨さにもエラーを与えたnusoapに切り替えこのように:

:nusoapで

$client = new nusoap_client("https://**.asmx?WSDL", true);
$client->setCredentials('HTTPUSER','HTTPPASS','basic');
$params = array( 'account' => '', 'msisdn'=>'NUMBER', 'password'=>'PASSWORD' );
$result = $client->call('Login', $params);

私はまた、呼び出しを行うためにカール拡張子をイネーブルしてみました

しかし、そのような運、それはエラーを与えることに保た:

HTTP Error: cURL ERROR: 56: Failure when receiving data from the peer url: http://*********.asmx
content_type:
http_code: 0
header_size: 0
request_size: 750
filetime: -1
ssl_verify_result: 0
redirect_count: 0
total_time: 21.015
namelookup_time: 0
connect_time: 0
pretransfer_time: 0
size_upload: 462
size_download: 0
speed_download: 0
speed_upload: 21
download_content_length: -1
upload_content_length: -1
starttransfer_time: 0
redirect_time: 0

私はドン何の問題もなくSOAPUIからそれを呼び出すことができる場合、私は、何もWebサービスと間違っていないことを100%確信しています」なぜ私はPHPから呼び出すことができないのか分かりません。

I結集...もっと私は..私は、私はすべてを試みだと思う何ができるのか分からない

編集:私はちょうど... PHP、Zendのから今回のために別のソープクラスを試してみました

結果は次のとおりです。

Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://**.asmx?WSDL' : failed to load external entity "https://*.asmx?WSDL" in C:\www\xpto_Atestes\Zend\Soap\Client\Common.php:51 Stack trace:
#0 C:\www\xpto_Atestes\Zend\Soap\Client\Common.php(51): SoapClient->SoapClient('https://**...', Array)
#1 C:\www****_Atestes\Zend\Soap\Client.php(1032): Zend_Soap_Client_Common->__construct(Array, 'https://**...', Array)
#2 C:\www****_Atestes\Zend\Soap\Client.php(1188): Zend_Soap_Client->_initSoapClientObject()
#3 C:\www***_Atestes\Zend\Soap\Client.php(1112): Zend_Soap_Client->getSoapClient() #4 [internal function]: Zend_Soap_Client->__call('Login', Array)
#5 C:\www****_Atestes\zend.php(28): Zend_Soap_Client->Login(Array)
#6 {main} thrown in

+0

こんにちはティオ 私は は、あなたはそれが仕事を得るために管理しました、(成功せず、ZendのとNuSoapてみてください)正確に同じ問題を抱えていますか?ありがとうございます。 Yv。 –

+0

@yjusot ..まあ、私は、WebサービスのWSDLであるNuSoapで問題を解決することができました。さまざまなフィールドに接頭辞が付いている必要がありました.NuSoapはそれらを入れませんでした。接頭辞はフィールドには必要ですが、$ client-> sendメソッドを使用することをお勧めします。このメソッドでは、要求XMLをパラメータとして渡します。このようにして、何かを変更する必要はありません。 – Tio

+0

あなたの回避策/解決策のもう少し詳細を教えてもらえますか?つまりプレフィックスは何ですか? –

答えて

2

ただ、他の誰にも、私はそれを解決する方法を知っているしたい場合には、自分自身に答えること。

問題は以下の通りであった、Webサービスの一つの要求XMLはこの形式でなければなりませんでした:

<?xml version="1.0" encoding="utf-8" ?> 
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"> 
    <SOAP-ENV:Body> 
     <ns123:IsTokenValid xmlns:ns123="http://www.xxxxxxx.com"> 
      <ns123:token xsi:type="xsd:string">'.$this->loginToken.'</ns123:token> 
     </ns123:IsTokenValid> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

私は接頭辞を言及するとき、私はns123部分に言及しています。問題は、ライブラリに正しいXMLを生成してサーバーに送ることができず、接頭辞を置かないため、要求がうまくいかないことです。

$nsValue = rand(1000, 9000); 
$requestXml = '<?xml version="1.0" encoding="utf-8" ?> 
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"> 
<SOAP-ENV:Body> 
<ns'.$nsValue.':IsTokenValid xmlns:ns'.$nsValue.'="http://www.xxxxxxx.com"> 
<ns'.$nsValue.':token xsi:type="xsd:string">'.$this->loginToken.'</ns'.$nsValue.':token> 
</ns'.$nsValue.':IsTokenValid> 
</SOAP-ENV:Body> 
</SOAP-ENV:Envelope>'; 
$result = WebService::CallWebService($this->endPoint, 'http://www.xxxxxxx.com/IsTokenValid', $requestXml, $this->httpUser, $this->httpPass); 

私は最初の魔女は、次のコードの結果、NuSoapクラスに直接行くことによって、それを解決し、1クラスのコードを変更しましたが、その後、私はNuSoapと私自身の要求XMLを作ることができる発見しました

WebServiceが:: CallWebServiceはこのような何かをして(ともエラー処理、セットのHTTP認証などを持っている)NuSoapクラスへの単なるラッパーです:

$client = new nusoap_client($webServiceLink, false); 
$result = $client->send($request, $soapAction, '', self::$timeout, self::$responseTimeout); 

イアンと皆、これは明らかであると思います。

関連する問題