Magento2 開發 – 正確實作API回應內容
在客製Magento時,有時會遇上需要擴充API端點來支援前端取資料或第三方的串接。API的擴充,會先新增API介面 (Interface),將其與路徑關聯在webapi.xml,再實作對應的類別 (class)並設定在di.xml。每個API端點對應到該類別的一個方法 (method),API回應的內容,取決於那個方法所吐出的值。
如果查看原生程式,會發現這些方法所回傳的格式是固定的,而Magento卻可以依據請求差異,對外給出不同的格式 (xml 或 json),這表示在回傳值真正被丟出去前,還有一層格式轉換,因此我們在實作回傳值時,必須依照Magento既有規則,才能讓API給出正確內容。
我們先以最簡單的範例,假設在客製的套件要擴充一個端點 rest/V1/astralweb/example/test ,回傳true。需要新增以下幾支檔案:
AstralWeb\Example\Api\ExampleInterface.php
AstralWeb\Example\Model\Example.php
etc/webapi.xml
etc/di.xml
利用postman工具,以 application/json; charset=utf-8 請求端點,會得到如下回應
假設現在要改為回傳陣列資料,首先要調整ExampleInterface裡所定義的回傳類型
然後改寫該方法所回傳的內容,這裡我們回傳兩筆虛擬資料
此時測試端點,可以成功拿到以下內容
到這裡都很簡單,接下就是今天的重點囉!
如果我們想要回傳的是獨立出來的一筆資料,而非多筆陣列,該如何做呢?
先嘗試直接回傳該筆資料
結果無法正確給出回應,實測結果資料的鍵值被移除了
正確做法,需要另外定義實作這筆資料的介面類別,然後在ExampleInterface上定義回傳該介面
AstralWeb\Example\Api\Data\TestInterface.php,該資料每個屬性都要明確定義出來
AstralWeb\Example\Model\Test.php,實作出資料類別,這裡各位可以假想成類似ORM的Model
更改API端點回傳的定義
回傳該資料類別
這下可以取到預期的資料囉
以上是基礎回傳的實作方式。那假設今天回傳的資料更為複雜,是巢狀結構呢?
實際測試,陣列類型 [] 的回傳下,可以直接轉換PHP的陣列結構,例如以下多筆帶有巢狀的資料
API可以直接取得對應的資料結構
但如果是回傳範例中的單筆 A 資料,則必須仿照TestInterface的方式,在新增的getParent方法定義回傳特定的資料介面,以及實作他的類別
雖然單筆資料的巢狀結構,實作上非常費事,但是為了順應原生架構在API上的支援度與靈活性,千萬不要為了省事,ˊ直接強行echo資料並中斷後續流程。善用重複使用的物件設計,盡量在可維護的前提下進行客製,才不會留債給後人唷。那麼我們下次再見囉!
如果有您有更多疑問可以詢問我們,未來會撰寫更多電商網站相關文章,喜歡歐斯瑞文章的讀者們,別忘了追蹤歐斯瑞臉書粉絲團、Instagram,以及訂閱我們的電子報,隨時接收第一手新知分享唷!
想學習更多Magento設定嗎?請見:Magento教學導覽
我要留言