Frage

Ich habe Probleme mit PHP Parsen einer Antwort der Soapclient Anruf. Für einige Arten von Antworten, ist es zurückkehr Arrays von leeren stdClass statt initialisiert stdClass Objekte Objekte.

Der Server ist ein Java-Webservice mit axis2 auf tomcat6 im Einsatz. Die Java-Signatur des problematischen Service-Aufruf ist public Course getCourseDetails(Long courseId) Course ist ein Standard-POJO wie folgt definiert:

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

    //etc...
}

Hole ist ein Standard POJO mit nur primitiven Mitglieder.

Wenn mit PHP genannt, die Löcher Element ein Array mit der richtigen Länge, aber jedes Loch ist leer.

$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

Drucken aus den zurückgegebenen XML mit $soapClient->__getLastResponse() was wie die korrekte Darstellung aussieht:

<?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>

Warum ist jeweils eine leere stdClass Loch? Gibt es bekannte Einschränkungen für die Anzahl der Ebenen Soapclient eine Antwort analysieren wird?

War es hilfreich?

Lösung 3

Dies scheint ein Fehler in PHP zu sein. http://bugs.php.net/bug.php?id=49070

Leider wird der Bug-Tracker lassen Sie mich auf sie nicht kommentieren.

Andere Tipps

Ich hatte ein ähnliches Problem. Ich ging jede Iteration durch Sie durchgemacht haben. Auf einem Dusel ich deaktiviert Caching „soap.wsdl_cache“ entweder durch die Datei php.ini oder ini_set('soap.wsdl_cache', WSDL_CACHE_NONE); ändern und auf meiner nächsten Anforderung war es, alle fehlenden Daten gefüllt. Dies kann leicht passieren, weil die „soap.wsdl_cache_ttl“ auf „86400“, die standardmäßig die 60 Tage sind.

Was ich herausfand, war, dass der SOAP-Server eine Codeänderung hatte. Erstellen eine neue WSDL-Datei. Die zwischengespeicherten Wsdl Client war an diesem Punkt abgestanden. Sie würden denken, dass zumindest eine Prüfsumme Hash irgendeine Art mit jeder Anforderung gehen würde, um zu überprüfen, dass die WSDL-Datei geändert hatte, aber es funktioniert nicht.

Um dieses Problem zu beheben und noch Caching verwende ich eine WSDL-Datei erstellt, die ich lokal verbrauchen könnte.

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

Hope dies hilft Ihnen, oder sonst jemand, der durch zu stoppen geschieht und haben ein ähnliches Problem.

Haben Sie diese Zahl alle aus durch Austesten oder den Inhalt der PHP-Objekt ausdrucken (print_r, var_dump)?

Haben Sie versucht, den tatsächlichen SOAP-Antwort-String Ausdrucke (nicht das PHP-Objekt)? Sie können dies tun, indem Sie die Soapclient mit dem Debug-Option-Set erstellen:

$soapClient = new SoapClient( "http://your.soap.server.com/services/yourWsdl.wsdl", array("trace" => 1));

Wenn Sie dann den Client verwenden, um Ihre SOAP-Anruf zu tätigen, Sie einen Blick auf, sowohl die Anfrage und die Antwort-Strings.

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

Dies könnte Ihnen helfen, herauszufinden, was Soapclient tut, wenn es die Antwort auf eine PHP-Objekt konvertieren. Weitere Informationen über __getLastResponse () .

Hier gehen wir fast ein Jahr und eine Hälfte später ...

In meiner letzten Halb ähnlichen Erfahrung war dies nicht ein PHP-Fehler. Es ist eine auf die Art und Weise beantwortet Ihre WebService geschrieben wird und wie PHP liest die Ausgabe. Ich erlebte ein ähnliches Problem (sogar bis auf getLastResponse die richtige XML-Rückkehr) und kam zu finden, dass es nicht so viel PHP oder meine SOAP-Funktion war, die ein Problem hatte, aber dass das Ergebnis der „broken“ -Funktion war nicht ausdrücklich definiert Cursor.

Beispiel für schlechte Cursor-Definition:

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

Beispiel guter Cursor-Definition:

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 ...

Anscheinend Java kann die „schlechte“ / nicht explizit Ausgabe ganz gut umgehen, aber PHP gibt einen Array von null Objekten.

Nicht sicher, ob dies werden Ihnen helfen, aber die Definition der Funktion Ausgabe Web Service als der „gute“ Weg, um mein Problem, das oben festgelegt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top