文章彙整

Magento2 開發 – 正確實作API回應內容

Astral WebBy Astral Web 1 month agoNo Comments
首頁  /  Magento  /  Magento-2  /  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教學導覽

以上內容由Astralweb 歐斯瑞編寫製作

 000

推薦文章

Categories:
  Magento-2MagentoMagento開發

留下回應

你的電子郵件地址不會被公開.

請到您的信箱確認,即可完成訂閱。