كيف أستهلك خدمة WebService التي تعود إلى PHP؟
-
23-09-2019 - |
سؤال
انا استخدم PHP 5.2.10 وأنا أحاول استهلاك خدمة ويب تعود أنواع البيانات المعقدة باستخدام امتداد الصابون القياسي.
المشكلة هي أن الصابون لا يملأ الكائنات التي يتم تداخلها في كائنات / صفيف من الكائنات. مثال مبسط على ما أحصل عليه عندما أسمي طريقة gootutente ، مع تحديد "my_unique_id" كمعلمة هو:
stdClass Object
(
[getUtenteReturn] => stdClass Object
(
[userName] => my_unique_id
[fieldOne] => ...
[fieldTwo] => ...
[utilizzatore] => stdClass Object
( // This is EMPTY instead of containing a series of userName's
)
)
)
الجزء ذي الصلة من وصف WDSL هو:
<element name="getUtenteResponse">
<complexType>
<sequence>
<element name="getUtenteReturn" type="tns1:Cliente"/>
</sequence>
</complexType>
</element>
...
<complexType name="Utilizzatore">
<sequence>
<element name="userName" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
...
<complexType name="Cliente">
<complexContent>
<extension base="tns1:Utilizzatore">
<sequence>
<element name="fieldOne" nillable="true" type="xsd:string"/>
<element name="fieldTwo" nillable="true" type="xsd:string"/>
<element name="utilizzatore" nillable="true" type="impl:ArrayOf_tns1_Utilizzatore"/>
</sequence>
</extension>
</complexContent>
</complexType>
ما وجدته أنا لست الوحيد الذي يواجه هذه المشكلة. على وجه الخصوص وجدت هذا التعليق في الوثائق الرسمية PHP و هذا إدخال المنتدى الآخر لإعطاء فكرتين مختلفتين حول كيفية التعامل مع المشكلة ، لكنني لم أتمكن من تحويل أي من هذين الاثنين الأفكار الى حل العمل: يبدو أنني لا أفهم تمامًا المنطق وراء الأمثلة المقدمة.
سأكون ممتنًا إذا كان بإمكان أي شخص أن يرشدني في هذا: سيكون بعض كود العمل على خدمة ويب أخرى موضع ترحيب ، لكن ما أنا عليه في المقام الأول هو فهم المشكلة ومنطق الحلول المقترحة (The Fish Lane ، وليس الأسماك!) . قون
المحلول
سؤال قديم ، لا إجابة. لقد تعثرت مؤخرًا في هذا المنشور ، وهذا ما يفسر المشكلة ويعطي حلاً: استهلاك SOAP ComplexType WebService مع PHP.
نصائح أخرى
إليكم أفكاري المباشرة ، آسف أن هذه ليست إجابة مناسبة ، فقط بعض الأفكار ...
أولاً ، هل حاولت مشاهدة طلب SOAP (المغلف) المرسلة إلى خادم الصابون؟ هل يبدو أنه يجب أن يعمل؟ هل يمكنك أن ترى إلى أين يحدث خطأ؟ هل تحصل فقط على خطأ ، أو Soapfault ، أو البيانات الخاطئة ، أو لا شيء على الإطلاق؟
ثانياً ، هل حاولت استخدام SoapParam
صف دراسي؟
أخيرًا ، أنا متأكد من أنك تقوم بذلك بشكل صحيح ، لكنني لاحظت أن الكائن الذي تقوم ببنائه يحتوي على اسم مستخدم و FieldOne و FieldTwo جميعهم جنبًا يظهر في مثالك) بينما يجب أن يكون اسم المستخدم داخل صفيف Utilizzatore ، لذلك لا ينبغي أن يكون الأمر أكثر مثل:
stdClass Object
(
[Cliente] => stdClass Object
(
[fieldOne] => ...
[fieldTwo] => ...
[utilizzatore] => stdClass Object
( // This is EMPTY instead of containing a series of userName's
)
)
)
إن فصل الصابون أمر محبط للغاية بالنسبة لي ، لذلك لا تأخذ أيًا من هذا النقد ، لأنني آمل فقط أن أفهم ذلك بنفسي بشكل أفضل من خلال تقديم أفكار قد تساعدك.
ماك ، شكرا جزيلا لاستجاباتك السريعة. انظر إلى ما هبطت .. لم أنظر إلى هذا في وقت سابق. وبالتالي تريد المشاركة هذه.