سؤال

أواجه مشكلة في تحليل PHP لاستجابة مكالمة Soapclient. بالنسبة لبعض أنواع الإجابات، فإنها تعود إلى صفائف من كائنات Stdclass فارغة بدلا من كائنات stdclass تهيئة.

الخادم هو خادم WebService Java المنتشر مع AXIS2 على Tomcat6. توقيع جافا من مكالمة الخدمة مشكلة 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 فارغة؟ هل هناك قيود معروفة على عدد المستويات سوف تحليل الاستجابة؟

هل كانت مفيدة؟

المحلول 3

يبدو أن هذا خطأ في PHP. http://bugs.php.net/bug.php؟id=49070.

لسوء الحظ، لن يسمح لي تعقب الأخطاء التعليق عليه.

نصائح أخرى

كان لي مشكلة مشابهة. ذهبت من خلال كل التكرار مررت به. في Fluke لقد قمت بتعطيل التخزين المؤقت "Soap.wsdl_cache" إما عن طريق تغيير ملف PHP.INI أو ini_set('soap.wsdl_cache', WSDL_CACHE_NONE); وعلى طلبي التالي، تم ملء جميع البيانات المفقودة. يمكن ضبط هذا بسهولة لأن "soap.wsdl_cache_ttl" مضبوط على "86400"، بشكل افتراضي، وهو 60 يوما.

ما اكتشفته هو أن خادم الصابون لديه تغيير رمز. إنشاء 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();

قد يساعدك ذلك في معرفة ما يفعله Soapclient عند تحويل الاستجابة إلى كائن PHP. مزيد من المعلومات حول __GetLastResponse ().

هنا نذهب ما يقرب من عام ونصف لاحقا ...

في تجربتي شبه التماثيل الأخيرة، لم يكن هذا خطأ PHP. إنها قضية تتعلق بالطريقة المكتوبة بخادم الويب الخاص بك وكيف يقرأ PHP الإخراج. كنت أعاني من مشكلة مماثلة (حتى إلى أسفل إلى GetLastResponse عودة XML الصحيح) وجاء للعثور على أنه لم يكن الكثير من PHP أو وظيفة الصابون التي كانت لها مشكلة، لكن نتيجة الوظيفة "المكسورة" لم تكن واضحة المؤشر المحدد.

مثال تعريف مؤشر سيئ:

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 إرجاع مجموعة من الكائنات الخالية.

لست متأكدا مما إذا كان هذا سيساعدك، ولكن تحديد إخراج وظيفة خدمة الويب كطريقة "جيدة" مثبتة مشكلتي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top