1

SOAP で問題が発生しました。これまでにこの問題に遭遇したことはなく、解決に役立つ情報がオンラインで見つかりません。

次のコード

$wsdl = "path/to/my/wsdl";
$client = new SoapClient($wsdl, array('trace' => true));
//$$textinput is passed in and is a very large string with rows in <item></item> tags
$soapInput = new SoapVar($textinput, XSD_ANYXML);
$res = $client->dataprofilingservice(array("contents" => $soapInput));
$response = $client->__getLastResponse();

var_dump($res);//outputs null
var_dump($response);//provides the proper response as I would expect.

SoapClient コンストラクターにパラメーターを渡して、soap のバージョンを定義しようとしましたが、役に立ちませんでした。また、トレース パラメータを false に設定し、存在しない状態で試してみましたが、予想どおり $response が null になりましたが、$res はまだ null でした。私はApacheを実行しているLinuxとWindowsの両方のインストールでコードを試しました。

WSDL での関数定義は次のとおりです (xxxx はセキュリティ上の理由からです)。

<portType name="xxxxServiceSoap">
 <operation name="dataprofilingservice">
  <input   message="tns:dataprofilingserviceSoapIn"/>
  <output message="tns:dataprofilingserviceSoapOut"/>
 </operation>
</portType>

__getLastResponse() を使用して動作していますが、適切に動作しないのは面倒です。

私は小さなテスト スクリプトをまとめました。戻り値の型に構造体は必要ですか?

//very simplifed dataset that would normally be 
//read in from a CSV file of about 1mb
$soapInput = getSoapInput("asdf,qwer\r\nzzxvc,ewrwe\r\n23424,2113");
$wsdl = "path to wsdl";

try {
  $client = new SoapClient($wsdl,array('trace' => true,'exceptions' => true));

} catch (SoapFault $fault) {
  $error = 1;
  var_dump($fault);
} 

try {
    $res = $client->dataprofilingservice(array("contents" => $soapInput));
    $response = $client->__getLastResponse();
    echo htmlentities($client->__getLastRequest());//proper request echoed
    echo '<hr>';
    var_dump($res);//null

    echo "<hr>";
    echo(htmlentities($response));//proper response echoed
} catch (SoapFault $fault) {
    $error = 1;
    var_dump($fault);

}         
function getSoapInput($input){
$rows = array();
    $userInputs = explode("\r\n", $input);

    $userInputs = array_filter($userInputs);
    //
    $inputTemplate = " <contents>%s</contents>";
    $rowTemplate = "<Item>%s</Item>";
    //
    $soapString = "";
    foreach ($userInputs as $row) {
        // sanitize
        $row = htmlspecialchars(addslashes($row));
        $xmlStr = sprintf($rowTemplate, $row);
        $rows[] = $xmlStr;
    }
    $textinput = sprintf($inputTemplate, implode(PHP_EOL, $rows));
    $soapInput = new SoapVar($textinput, XSD_ANYXML);

   return $soapInput;

}
4

2 に答える 2

1

よく掘り下げた後、それは相対名前空間に関連していますが、PHP は WSDL または SOAP エンベロープ内でそれらを適切に処理していないようです。したがって、SOAP サーバーを制御できないため、引き続き __getLastResponse(); を介して応答を取得します。

これにより、見つけるのが困難だった時間を節約できることを願っています。

于 2012-06-29T19:45:47.387 に答える
0

あなたはここで物事を混ぜています。__getLastResponse()オプションを使用すると、サーバーから生の XML 文字列応答が返され'trace' => trueます。これはデバッグ専用です。

かどうかに関係'trace' => trueなく、最初に呼び出したいメソッドは同じものを返しますが、それはまったく正常です。トレースを on に設定しても動作は変わりません。追加機能である の戻り値が提供されるだけです__getLastResponse()

SoapClient例外をスローしないので、呼び出しは正常に行われてNULLおり、有効な戻り値であると言えます。

実際の XML 文字列や WSDL 定義を提供して、そうであるかどうかを調べることができます

于 2012-06-28T18:27:47.770 に答える