POST からカスタム REST API ルートへの応答がありません
-
12-12-2019 - |
質問
Magento の 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));
「success」、「error」、「model」は api2.xml で属性として定義されているため、使用できる必要があります。でも戻ってきたら $response
, 、応答はステータス207で空です...うーん!action_type コレクションがあるので、 $response
別の配列内にラップされましたが、成功しませんでした。
私の最後のトライアウトでは、メソッドでデータを設定することでそれを理解しました $this->getResponse()->addMessage(....)
データを取得することはできますが、これは成功/エラー/警告メッセージ タイプのものと考えられており、データ タイプの要件に合わないため、これが正しい方法ではないと思います。
最後になりましたが、次を使用してデータを返そうとしました。 $this->getResponse()->setBody($result)
そして $this->getResponse()->setRawBody($result)
メソッドを使用しましたが、やはり成功しませんでした:
Magento の専門家 - REST API への POST リクエストからデータを取得する正しい方法は何ですか?どうしてもあなたの助けが必要です!!
これが私の 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 に Location ヘッダーを設定するだけの作成操作では使用されません。
属性フィルタリングを活用するには、次を使用します。 $this->getFilter()->out($data)
前に $this->_render($data)
Mage_Api2_Model_Resource::dispatch()
Magento REST に関する多くの質問に答えることができます。
他のヒント
からデータを取得することができました _createMulti()
@raivis.krumins の提案に従って機能してください。内部 dispatch()
の機能 Mage_Api2_Model_Resource
class の最後にある 228 行目の後にこれらの 3 行を追加しました。 if
ロケーションヘッダーが設定されているステートメント:
$retrievedData = $this->_createMulti($filteredData);
$returnData = $this->getFilter()->out($retrievedData);
$this->_render($returnData);
最初の行は関数から結果を取得し、2 行目は不要な属性 (設定されていない属性) を除外します。 api2.xml
)、最後に 3 行目で応答のデータが返されます。
これらの変更は常にカスタム モジュールで行う必要があることに注意してください。コアクラスは絶対に変更しないでください。
カスタムモジュール関数セットでの再実行の直前
$this->getResponse()->appendBody(json_encode($response));