لا توجد استجابة من POST إلى مسار REST Api المخصص
-
12-12-2019 - |
سؤال
لقد قمت بإعداد مسار مخصص للعمل لـ Magento's REST Api.
إنه يعمل بشكل جيد مع طلبات GET، مثل _retrieve()
وظيفة المقابلة V1.php
يتم استدعاء الفصل كما هو متوقع ويقوم بإرجاع البيانات.لكنني الآن أحاول التعامل مع طلبات POST وذلك عندما يتصرف Magento بشكل غريب:
- عندما تريد نشر البيانات، يجب عليك تحديد البيانات كمجموعة بدلاً من كيان فيها
etc/api2.xml
مثله:<action_type>collection</action_type>
.وإلا فإن Magento سوف يرمي هذا الخطأMage_Api2_Model_Resource
(السطر 207):
// Creation of objects is possible only when working with collection
$this->_critical(self::RESOURCE_METHOD_NOT_IMPLEMENTED);
لذلك عندما أقوم بتعريف action_type كمجموعة، فإن _multiCreate()
وظيفة المقابلة V1.php
يتم استدعاؤه كما هو متوقع.
لكن Magento الآن لا يسمح لي بإرجاع أي بيانات.أريد إرجاع هذه المصفوفة بتنسيق JSON:
$response = array("success"=>true, "error"=>"", "model"=>array(1,2,3));
يتم تعريف "النجاح" و"الخطأ" و"النموذج" كسمات في api2.xml وبالتالي يجب أن تكون متاحة.ولكن عندما أعود $response
, ، الاستجابة فارغة مع الحالة 207 ...أمم!الآن نظرًا لأنه يحتوي على مجموعة action_type، فقد حاولت أيضًا إرجاع ملف $response
ملفوفة داخل مجموعة أخرى، ولكن دون نجاح.
في تجاربي النهائية اكتشفت ذلك عن طريق تعيين البيانات بهذه الطريقة $this->getResponse()->addMessage(....)
أنا قادر على استرداد البيانات، ولكن لا أعتقد أن هذه هي الطريقة الصحيحة كما يُعتقد أنها مناسبة لأنواع رسائل النجاح/الخطأ/التحذير ولا تناسب متطلبات نوع البيانات الخاصة بي.
أخيرًا وليس آخرًا، حاولت أيضًا إرجاع البيانات باستخدام ملف $this->getResponse()->setBody($result)
و $this->getResponse()->setRawBody($result)
الأساليب، ولكن مرة أخرى - لا نجاح:
إذن يا خبراء Magento - ما هي الطريقة الصحيحة لاسترداد البيانات من طلب POST إلى REST Api؟أنا في أمس الحاجة إلى مساعدتكم!!
هنا بلدي api2.xml
:
<customer_login translate="title" module="Test_Restapi">
<group>restapi</group>
<model>restapi/api2_customer_login</model>
<title>Blablabla</title>
<sort_order>10</sort_order>
<privileges>
<customer>
<create>1</create>
<update>1</update>
<retrieve>1</retrieve>
</customer>
<guest>
<create>1</create>
<update>1</update>
<retrieve>1</retrieve>
</guest>
</privileges>
<attributes>
<success>Success</success>
<error>Error</error>
<model>Model</model>
</attributes>
<routes>
<route_collection>
<route>/restapi/customer/login</route>
<action_type>collection</action_type>
</route_collection>
</routes>
<versions>1</versions>
</customer_login>
المحلول
إذا ألقيت نظرة على الصف Mage_Api2_Model_Resource
والتي ينبغي تمديدها من قبل صفك، يمكنك العثور على وظيفة _render()
.
بالفحص dispach()
وظيفة هذه الفئة، يمكنك أن ترى أن _render()
يتم استدعاء الدالة عن طريق عمليات الاسترداد.لذا يمكنك استخدام هذه الوظيفة في نهاية الإجراء الخاص بك على هذا النحو $this->_render($data)
.
لا يتم استخدام هذه الوظيفة من خلال عمليات الإنشاء، والتي تقوم فقط بتعيين رأس الموقع على عنوان URL للمورد الذي تم إنشاؤه حديثًا.
للاستفادة من تصفية السمات، استخدم $this->getFilter()->out($data)
قبل $this->_render($data)
Mage_Api2_Model_Resource::dispatch()
يمكن الإجابة على الكثير من الأسئلة المتعلقة بـ Magento REST!
نصائح أخرى
تمكنت من استرجاع البيانات من _createMulti()
تعمل باتباع اقتراحات @raivis.krumins.داخل dispatch()
وظيفة Mage_Api2_Model_Resource
أضفت هذه الأسطر الثلاثة بعد السطر 228 في نهاية الفصل if
بيان حيث يتم تعيين رأس الموقع:
$retrievedData = $this->_createMulti($filteredData);
$returnData = $this->getFilter()->out($retrievedData);
$this->_render($returnData);
يسترد السطر الأول النتيجة من الوظيفة، بينما يقوم السطر الثاني بتصفية السمات غير المرغوب فيها (تلك التي لم يتم تعيينها api2.xml
) وأخيرًا يقوم السطر الثالث بإرجاع البيانات الموجودة في الاستجابة.
يرجى ملاحظة أن هذه التغييرات يجب أن يتم إجراؤها دائمًا في وحدة نمطية مخصصة.لا تغير الطبقة الأساسية أبدًا!
قبل إعادة التشغيل مباشرة في مجموعة وظائف الوحدة النمطية المخصصة
$this->getResponse()->appendBody(json_encode($response));