0

私はロープの終わりにいるので、コミュニティに助けを求める時が来ました.私はこの問題について見つけることができるリソースをウェブで略奪してきましたが、誰も助けてくれません.

現在、PHP を介して Java Webservice サーバーと通信しようとしています。WSDL をプルダウンし、その機能と型を__getFunctions();および__getTypes();

この形式でクライアントを作成しています

new SoapClient("https://username:password@ip:port/path/to/wsdl?wsdl");

最初はこれで問題はありませんが、このサービスで関数を呼び出そうとすると、2 つの応答のうちの 1 つが返されます。

そのうちの 1 つがタイムアウト エラーであることはわかっていますが、2 つ目はまだわかりません。

エラー :SoapFault exception: [SOAP-ENV:Client] [MT-IP] SOAP message is not well formed in...

コードは次のとおりです。

// All of this works

$options["login"]    = "login";
$options["password"] = "password";

$wsdl   = "https://" . $options["login"] . ":" . $options["password"] . "@ip:port/path/to/wsdl?wsdl";
$client = new SoapClient($wsdl, $options);

try {
    $functions = $client->__getFunctions();
    $types     = $client->__getTypes();

    $params = new stdClass();
    $params->pong = (string)"Hello World!";

    // This fails

    $result = $client->ping($params);
    var_dump($result);
} catch (SoapFault $exception) {
    echo $exception;
}

追加するために、次のような利用可能なすべての方法でメソッドを呼び出すことも試みました

$client->__soapCall("ping", array($params));
$client->__soapCall("ping", array(array("pong" => "Hello World!)));
$client->__soapCall("ping", array("pong" => "Hello World"));
$client->__soapCall("ping", array("parameters" => array("pong" => "Hello World"));

// and some more..

WSDLに対してテストしている WSDL も表示されます。

Web サービスSOAP TESTを呼び出そうとするページも表示できます。

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="com.computas.mt.extern.Ping">
    <SOAP-ENV:Body>
        <ns1:ping>
            <pong>Hello World!</pong>
        </ns1:ping>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
4

2 に答える 2

1

私の場合、サーバーが必要としていた回路図は、PHP が送信していた要求のものとは異なっていました。解決策は、SoapClient を拡張することによって、送信される前に要求 XML を物理的に変更することでした。サーバーが通常提供する XML レイアウトを取得すると、問題の変更が見つかりました。

class MySoapClient extends SoapClient {
    function __doRequest( $request, $location, $action, $version, $one_way = NULL ) {
        $request = str_replace("SOAP-ENV", "soapenv", $request);
        $request = str_replace("xsi", "com", $request);
        $request = str_replace("ns1", "com", $request);
        var_dump($request);
        return parent::__doRequest( $request, $location, $action, $version, $one_way );
    }
}
于 2013-01-24T08:18:45.343 に答える
0

ユーザー名とパスワードを URL に含めないでください。SoapClient は、この目的のためにパラメーターを提供するオプション配列を受け入れます。http://de2.php.net/manual/en/soapclient.soapclient.php

于 2013-01-22T00:29:06.160 に答える