문제

에 문제가 있 PHP 의 구문 분석 SoapClient 호출합니다.의 몇 가지 유형에 대한 답변,그것은 배열을 반환하의 빈 stdClass 개체의 초기화 stdClass 개체입니다.

서버 java 웹 서비스와 함께 배포됩 axis2on tomcat6.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

인쇄 반환되는 XML $soapClient->__getLastResponse() 같이 보이는 것이 올바른 표현:

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

불행히도, 버그 추적기는 내가 그것에 대해 언급하지 않을 것입니다.

다른 팁

비슷한 문제가있었습니다. 나는 당신이 겪은 모든 반복을 겪었습니다. Fluke에서 나는 php.ini 파일을 변경하여 "soap.wsdl_cache"를 비활성화했습니다. ini_set('soap.wsdl_cache', WSDL_CACHE_NONE); 그리고 다음 요청에서 모든 누락 된 데이터가 채워졌습니다. "soap.wsdl_cache_ttl"이 기본적으로 60 일인 "86400"으로 설정되기 때문에 쉽게 발생할 수 있습니다.

내가 알게 된 것은 비누 서버에 코드 변경이 있다는 것입니다. 새 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)의 내용을 디버깅하거나 인쇄 하여이 모든 것을 알아 냈습니까?

실제 비누 응답 문자열 (PHP 객체가 아님)을 인쇄 해 보셨습니까? 디버그 옵션 세트로 SOAPClient를 만들어 다음을 수행 할 수 있습니다.

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

그런 다음 클라이언트를 사용하여 비누 호출을 할 때 요청과 응답 문자열을 모두 살펴볼 수 있습니다.

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

이렇게하면 응답을 PHP 객체로 변환 할 때 Soapclient가 무엇을하고 있는지 파악하는 데 도움이 될 수 있습니다. __getLastResponse ()에 대한 자세한 정보.

여기서 우리는 갈 거의 일년에 절반이 나중에...

에 최근 세미 비슷한 경험이 없었 php 버그입니다.그것은 관련된 문제를 방식의 웹 서비스에 쓰는 방법과 PHP 읽습니다.었을 경험하고는 유사한 문제(도 getLastResponse 반환하는 올바른 XML)고 왔는지 너무 많이 PHP 나누는 기능에 문제가 있었지만 결과는"broken"기능이 없었다는 명시적으로 정의합니다.

예쁜 커서 정의:

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 을 처리 할 수 있다"bad"/non 명시적 출력 그냥 좋은,하지만 PHP 의 배열을 반환합니다 null 개체입니다.

가 확실하지 않으면 이것은 당신을 도울 것입니다,그러나 정의하는 웹 서비스 출력 기능으로"좋은"위의 방법으로 수정 나의 문제입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top