4

この問題は一日中私を殺してきました。

基本HTTP認証を使用するクライアントWebサービスhttps:// * .asmx?WSDLがあります。

SoapUIを使用してWebサービスに接続すると、すべてがエラーなしで完全に機能します。

問題は、PHPに切り替えるときです...

なんとか接続でき、php用のsoapclient拡張機能を使用してサーバーから関数リストを取得できます(PHP 5.3.0を使用しています)。

PHP用のsoapclient拡張機能を使用して関数を呼び出そうとすると、次のエラーが発生します。

致命的なエラー:キャッチされないSoapFault例外:[HTTP] C:\ www \ xpto_Atestes \ soapclient.php:26スタックトレースのhttpヘッダーのフェッチエラー:#0 [内部関数]:> SoapClient-> __ doRequest(' * ** .. .. '、' http:// * *** ...'、1、0)#1> C:\ www \ xpto_Atestes \ soapclient.php(26):SoapClient-> __ soapCall(' login'、Array)#2 {main}> 26行目のC:\ www \ xpto_Atestes\soapclient.phpにスローされます

より明確なエラー(呼び出しの結果のprint_rを実行する場合):

[faultstring]=>httpヘッダーのフェッチ中にエラーが
発生しました[faultcode]=>HTTP

次のヘッダーが送信されます。

POST / * .asmx HTTP / 1.1ホスト:* .pt接続:Keep-Aliveユーザーエージェント:> PHP-SOAP / 5.3.0コンテンツタイプ:text / xml; charset = utf-8 SOAPAction: "http:// * * / Login"> Content-Length:264認証:基本AUTHSECRETPASS

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

$ soapParams = array('login' =>'HTTP_LOGIN'、
'password' =>'HTTP_PASS'、
'authentication' => SOAP_AUTHENTICATION_BASIC、
'trace' => 1、
'exceptions' => 0
);
$ client = new SoapClient( "https:// * *** .asmx?WSDL"、$ soapParams); echo"接続済み
"; $ params = array('account' =>''、'msisdn' =>'NUMBER'、'password' =>'PASSWORD'); $ result = $ client-> __ soapCall( "login"、$ params);

しばらくグーグルして問題が何であるかを見つけようとした後、私はnusoapに切り替えました..私の悲惨なことにそれはまたエラーを与えました:

エラー

HTTPエラー:ヘッダーのソケット読み取りがタイムアウトしました

リクエスト

POST / * * .asmx HTTP / 1.0ホスト:* .ptユーザーエージェント:NuSOAP / 0.9.5(1.123)コンテンツタイプ:text / xml; charset = ISO-8859-1 SOAPAction: "http:// * *** / Login"認証:基本AUTHSECRETPASSコンテンツ-長さ:481

NUMBERPASSWORD

応答

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

$ 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);

nusoapを使用して、curl拡張機能を有効にして呼び出しを行うことも試みました。

$ client-> setUseCurl(true);

しかし、そのような運はありません、それはエラーを出し続けました:

HTTPエラー:cURLエラー:56:ピア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

Webサービスに問題はないと100%確信しています。問題なく、SoapUIから呼び出すことができれば、PHPから呼び出せない理由がわかりません。

ラリーはこれ以上何ができるのかわからない…全部やってみたと思う…

編集:PHP用の別のSoap Classを試しましたが、今回はZendからです。

結果は次のとおりです。

致命的なエラー:キャッチされないSoapFault例外:[WSDL] SOAP-エラー:WSDLの解析:「https:// * * .asmx?WSDL」からロードできませんでした:外部エンティティ「https:// * .asmx?WSDL 」のロードに失敗しました"C:\ www \ xpto_Atestes \ Zend \ SOAP \ Client \ Common.php:51スタックトレース:
#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 [内部関数]:Zend_Soap_Client-> __ call('Login'、Array)
#5 C:\ www ** ** _Atestes \ zend .php(28):Zend_Soap_Client-> Login(Array)
#6{main}がスローされます

4

1 に答える 1

2

誰かが私がそれをどのように解決したかを知りたい場合に備えて、自分自身に答えるだけです。

問題は次のとおりでした。Webサービスの1つのリクエスト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を生成したライブラリがなく、プレフィックスを付けないため、リクエストが機能しなかったことです。

最初にNuSoapクラスに直接移動し、クラスの1つでコードを変更することで解決しましたが、NuSoapを使用して独自のリクエスト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);

WebService :: CallWebServiceは、次のようなことを行うNuSoapクラスの単なるラッパーです(エラー処理、セットのHTTP認証などもあります)。

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

イアンと他のみんな、これが明確であることを願っています。

于 2011-10-21T19:21:32.780 に答える