質問

私はのSoapClient呼び出しの応答のPHPのパースとのトラブルを抱えています。回答のタイプによっては、それが空はstdClassの配列を返す代わりに、初期化はstdClassオブジェクトのオブジェクトます。

サーバーは、tomcat6上のAxis2で展開するJava Webサービスです。問題のサービスコールのJavaのシグネチャはpublic Course getCourseDetails(Long courseId)コースであるとして定義された標準POJOである

public class Course {
    private Long id;
    private List<Hole> holes;
    private String name;
    private String tees;

    //etc...
}

穴はプリミティブメンバーと標準POJOです。

PHPで呼び出された場合、

、孔部材が正しい長さの配列であるが、各穴は空である。

$args = array();
$args["courseId"] = $courseId;
$response = $client->getCourseDetails($args);
$course = $response->return;
//course has all of its primitive members set correctly: good
$holes = $course->holes;
//holes is an array with count = 18: good
$hole = $holes[0];
//hole is an empty stdClass: bad

正しい表現のように見えるもの$soapClient->__getLastResponse()で返されたXMLをプリントアウトます:

<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<ns:getCourseDetailsResponse xmlns:ns="http://webservice.golfstats">
<ns:return xmlns:ax21="http://datastructures.server.golfstats/xsd" xmlns:ax22="http://util.java/xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ax24="http://uuid.eaio.com/xsd" xsi:type="ax21:Course">
<ax21:courseLocation>Faketown, VA</ax21:courseLocation>
<ax21:courseName>Fake Links</ax21:courseName>
<ax21:dateAdded>2003-01-02</ax21:dateAdded>
<ax21:holes><ax21:id>1</ax21:id><ax21:number>1</ax21:number><ax21:par>4</ax21:par><ax21:yardage>345</ax21:yardage></ax21:holes>
<ax21:holes><ax21:id>2</ax21:id><ax21:number>2</ax21:number><ax21:par>3</ax21:par><ax21:yardage>150</ax21:yardage></ax21:holes>
<ax21:holes><ax21:id>3</ax21:id><ax21:number>3</ax21:number><ax21:par>5</ax21:par><ax21:yardage>502</ax21:yardage></ax21:holes>
<ax21:holes><ax21:id>4</ax21:id><ax21:number>4</ax21:number><ax21:par>4</ax21:par><ax21:yardage>345</ax21:yardage></ax21:holes>
<ax21:holes><ax21:id>5</ax21:id><ax21:number>5</ax21:number><ax21:par>4</ax21:par><ax21:yardage>345</ax21:yardage></ax21:holes>
<ax21:holes><ax21:id>6</ax21:id><ax21:number>6</ax21:number><ax21:par>4</ax21:par><ax21:yardage>345</ax21:yardage></ax21:holes>
<ax21:holes><ax21:id>7</ax21:id><ax21:number>7</ax21:number><ax21:par>4</ax21:par><ax21:yardage>345</ax21:yardage></ax21:holes>
<ax21:holes><ax21:id>8</ax21:id><ax21:number>8</ax21:number><ax21:par>4</ax21:par><ax21:yardage>345</ax21:yardage></ax21:holes>
<ax21:holes><ax21:id>9</ax21:id><ax21:number>9</ax21:number><ax21:par>4</ax21:par><ax21:yardage>345</ax21:yardage></ax21:holes>
<ax21:holes><ax21:id>10</ax21:id><ax21:number>10</ax21:number><ax21:par>4</ax21:par><ax21:yardage>345</ax21:yardage></ax21:holes>
<ax21:holes><ax21:id>11</ax21:id><ax21:number>11</ax21:number><ax21:par>4</ax21:par><ax21:yardage>345</ax21:yardage></ax21:holes>
<ax21:holes><ax21:id>12</ax21:id><ax21:number>12</ax21:number><ax21:par>4</ax21:par><ax21:yardage>345</ax21:yardage></ax21:holes>
<ax21:holes><ax21:id>13</ax21:id><ax21:number>13</ax21:number><ax21:par>4</ax21:par><ax21:yardage>345</ax21:yardage></ax21:holes>
<ax21:holes><ax21:id>14</ax21:id><ax21:number>14</ax21:number><ax21:par>4</ax21:par><ax21:yardage>345</ax21:yardage></ax21:holes>
<ax21:holes><ax21:id>15</ax21:id><ax21:number>15</ax21:number><ax21:par>4</ax21:par><ax21:yardage>345</ax21:yardage></ax21:holes>
<ax21:holes><ax21:id>16</ax21:id><ax21:number>16</ax21:number><ax21:par>4</ax21:par><ax21:yardage>345</ax21:yardage></ax21:holes>
<ax21:holes><ax21:id>17</ax21:id><ax21:number>17</ax21:number><ax21:par>4</ax21:par><ax21:yardage>345</ax21:yardage></ax21:holes>
<ax21:holes><ax21:id>18</ax21:id><ax21:number>18</ax21:number><ax21:par>4</ax21:par><ax21:yardage>345</ax21:yardage></ax21:holes>
<ax21:id>1</ax21:id>
<ax21:rating>68.5</ax21:rating>
<ax21:slope>113</ax21:slope>
<ax21:tees>Blue</ax21:tees>
</ns:return>
</ns:getCourseDetailsResponse>
</soapenv:Body>
</soapenv:Envelope>

なぜそれぞれが、空はstdClassの孔でありますか?応答を解析するのSoapClientレベルの数に限界が知られていますか?

役に立ちましたか?

解決 3

これはPHPのバグのように見えます。 http://bugs.php.net/bug.php?id=49070

残念ながら、バグトラッカーは、私がそれにコメントすることはできません。

他のヒント

私は同様の問題がありました。私はあなたが通過した各反復を通り抜けました。まぐれで私は無効キャッシング「soap.wsdl_cache」のいずれかのphp.iniファイルまたはini_set('soap.wsdl_cache', WSDL_CACHE_NONE);を変更することで、私の次の要求に不足しているすべてのデータが移入されました。 「soap.wsdl_cache_ttl」が「86400」に設定されているので、これは簡単に60日で、デフォルトで、発生する可能性があります。

私が見つけた何SOAPサーバーは、コードの変更があったということでした。新しいWSDLを作成します。クライアントのキャッシュされたWSDLは、その時点で陳腐でした。あなたは、少なくとも、いくつかの種類のチェックサムハッシュは、WSDLが変更されたことを確認するために、各要求で出て行くだろう、と思うだろうが、それはしません。

この問題を解決し、まだ私は、私がローカルに消費できたWSDLファイルを作成したキャッシュを使用します。

    $cache = Services_Utilities::getCacheResource();
    if (!$cache->test(self::CACHE_KEY)) {
        $data = file_get_contents($wsdl);
        $cache->save($data, self::CACHE_KEY);
        file_put_contents($newWsdl, $data);
        if (file_exists($newWsdl)) {
            $wsdl = $newWsdl;
        }
    } else {
        if (file_exists($newWsdl)) {
            $wsdl = $newWsdl;
        }
    }

    // Remove $newWsdl when necessary
    // unset($newWsdl);

希望これは、あなたや立ち寄り、同様の問題を抱えているために起こる他の誰に役立ちます。

あなたはデバッグですべてのアウトこれを理解するか、PHPのオブジェクト(しますprint_r、のvar_dump)の内容をプリントアウトしましたか。

あなたは、実際のSOAP応答文字列(いないPHPオブジェクト)をプリントアウトしたことがありますか?あなたは、デバッグオプションを設定してのSoapClientを作成することによってこれを行うことができます:

$soapClient = new SoapClient( "http://your.soap.server.com/services/yourWsdl.wsdl", array("trace" => 1));
あなたはSOAP呼び出しを行うために、クライアントを使用する場合、

次に、あなたはリクエストとレスポンスの文字列の両方を見てみることができます。

$response = $soapClient->getCourseDetails($params);
$requestAsString = $soapClient->__getLastRequest();
$responseAsString = $soapClient->__getLastResponse();

これは、あなたがそれをPHPオブジェクトへの応答を変換だときのSoapClientが何をしているか把握に役立つかもしれません。 __getLastResponse()の上の詳細情報。

ここでは、ほぼ一年半後に行く...

私の最近の半似たような経験では、これはPHPのバグではありませんでした。それはあなたのWebサービスが書き込まれている方法とどのようにPHPの出力を読み取りに関連する問題です。私は(正しいXMLを返すでgetLastResponseにでもダウン)同様の問題を経験し、それが問題を持っていたので、多くのPHPや私のSOAP機能がなかったことを見つけるために来たが、「壊れた」関数の結果は、明示的ではなかったということでした定義されたカーソルます。

悪いカーソル定義の例:

PROCEDURE GetBlahByBlahID(IN IN_BLAH_ID VARCHAR, IN IN_BLAHPKG VARCHAR,                                     
OUT result CURSOR
) BEGIN ...

良いカーソル定義の例:

PROCEDURE GetBlahByBlahID(IN IN_BLAH_ID VARCHAR, IN IN_BLAHPKG VARCHAR,                                     
OUT result CURSOR (  BLAH VARCHAR(250),
                     BLAH2 VARCHAR(250),
                     BLAH_DATE DATE,
                     BLAH3 VARCHAR(250))) BEGIN ...

どうやらJavaはちゃんと「悪い」/非明示的な出力を扱うことができますが、PHPは、ヌルオブジェクトの配列を返します。

これはあなたを助けるが、「良い」の方法は、上記の私の問題を修正して、Webサービス機能の出力を定義するかどうかわからない。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top