سؤال

لقد قمت بإعداد مسار مخصص للعمل لـ 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));

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