Cevabın eksik parçaları PHP SoapClient çağrı yanıt

4 Cevap php

Ben bir SoapClient çağrısının yanıt PHP ayrıştırma ile sorun yaşıyorum. Cevaplar bazı türleri için, bunun yerine başlatıldı stdClass nesnelerin boş stdClass nesnelerin dizileri dönüyor.

Sunucu Tomcat6 üzerinde axis2 ile dağıtılan bir java Webcoder olduğunu. Sorunlu servis çağrısı Java imzası public Course getCourseDetails(Long courseId) Kursu olarak tanımlanan standart bir POJO olduğunu:

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

    //etc...
}

Delik sadece primative üyeleri ile standart bir POJO olduğunu.

PHP ile çağrıldığında, delikler üye doğru uzunlukta bir dizidir, ama her delik boş.

$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

Ile döndürülen XML yazdırarak $soapClient->__getLastResponse() ne doğru temsil gibi görünüyor:

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

Neden her boş stdclass delik var mı? SoapClient bir yanıt ayrıştırmak düzeylerinin sayısı bilinen sınırlama var mı?

4 Cevap

Bu PHP bir hata gibi görünüyor. http://bugs.php.net/bug.php?id=49070

Ne yazık ki, bug tracker bana bunun üzerine yorum izin vermez.

Ben benzer bir sorunu vardı. Ben geçti her yineleme geçti. Bir tesadüftü Ben engelli önbelleğe alma "soap.wsdl_cache" PHP.INI dosyasını değiştirerek veya ini_set('soap.wsdl_cache', WSDL_CACHE_NONE); ve benim bir sonraki istek üzerine ya tüm eksik veri doldurulan. "Soap.wsdl_cache_ttl" 60 gündür varsayılan tarafından, "86400" olarak ayarlı, çünkü bu kolay olabilir.

Ne öğrendim sabun sunucu bir kod değişikliği vardı. Yeni bir wsdl oluşturma. Müşterinin önbelleğe Wsdl bu noktada bayat. En azından, bir tür sağlama karma wsdl değişmiş olduğunu doğrulamak için her isteği ile çıkmak istiyorum, düşünürdüm ama öyle değil.

Bu sorunu çözmek ve hala ben yerel tüketmek verebilecek bir wsdl dosyası oluşturuldu önbelleğe kullanın.

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

Bu sizi ya tarafından durdurmak ve benzer bir sorun var olur başka kimse yardımcı olur umarım.

Eğer hata ayıklama yoluyla bu tüm anlamaya veya PHP nesne (print_r, var_dump) içeriğini dışarı baskı mı?

Eğer gerçek SOAP yanıt dize (değil PHP nesne) yazdırarak denediniz mi? Sen debug seçeneği seti ile SoapClient oluşturarak bunu yapabilirsiniz:

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

Eğer SOAP arama yapmak için istemci kullandığınızda Sonra, istek ve yanıt dizeleri hem de bir göz atabilirsiniz.

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

Bu, PHP nesnesine dönüştürürken yanıtı olduğunda SoapClient ne yaptığını anlamaya yardımcı olabilir. More info on __getLastResponse().

Burada yaklaşık bir yıl ve bir buçuk sonra gitmek ...

Benim son yarı-benzer bir deneyim bu bir php hata değildi. Bu sizin webservice yazılı şekilde ve nasıl PHP çıkışı okur ile ilgili bir konudur. Ben benzer bir sorun (hatta doğru XML dönen getLastResponse aşağı) yaşıyor ve "kırık" işlevinin sonucu bir açık değildi o kadar PHP veya bir sorunu vardı benim SABUN işlevi değildi ama bulmak için geldi tanımlı imleç.

Kötü imleç tanım örneği:

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

Iyi imleç tanım örneği:

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

Görünüşe Java "kötü" / non açık çıkış gayet işleyebilir, ama PHP boş nesnelerin bir dizisini döndürür.

Bu size yardımcı olacaktır emin, ancak yukarıda "iyi" yolu olarak web servis fonksiyon çıkışını tanımlayan değil benim sorunum sabit.