Jmix 中 REST API 的兩種實現

你知道嗎,在 Jmix 中 , REST API 有兩種實現方式!
很多應用是采取前后端分離的方式進行開發 。這種模式下,對前端的選擇相對靈活,可以根據團隊的擅長技能選擇流行的 Angular/React/Vue 之一,或者前端為App/小程序等手機應用 。Jmix 的一種典型應用場景就是作為這種類型應用程序的高級別管理 UI 和后端 。為此,Jmix 提供了強大的通用 REST API 功能 , 支持包括開箱即用的實體、文件、元數據、用戶會話的 API 以及經過簡單配置就能支持的業務邏輯(服務)REST API 。
由于 Jmix 是基于 Spring Boot 框架,因此也支持 Spring 的 RestController 。那么對于 Spring 的 REST API 機制和 Jmix 提供機制 , 究竟有什么不同,而我們在開發時又該如何選擇呢?本文將通過具體的代碼示例,介紹這兩種 API 的區別,相信看完之后 , 該如何選擇您心里應該有數了 。
數據模型和服務我們假設一個簡單的場景,為了給用戶提供湊單功能,我們在后端寫一個服務用于查詢低于某個價格的產品(Product) , 并將滿足條件的產品列表返回給客戶端 。
數據模型首先我們構建一個簡單的 JPA 實體:Product 類,包含名稱和價格兩個屬性:
@JmixEntity@Table(name = "SLS_PRODUCT")@Entity(name = "sls_Product")public class Product {@JmixGeneratedValue@Column(name = "ID", nullable = false)@Idprivate UUID id;@InstanceName@Column(name = "NAME")private String name;@Column(name = "PRICE")private Double price;... // 其他屬性}

實體通過 Jmix Studio 創建可以選擇其他實體特性,比如版本、實體審計、軟刪除屬性等 。
服務可以像普通 Spring Boot 應用那樣 , 自己手動創建一個 @Service 類 。也可以通過 Jmix Studio 提供的創建 bean 的功能創建 Service 。這里我們用 Jmix Studio 創建一個 Bean , 該功能默認創建帶 @Component 注解的類,我們手動將類注解修改為 @Service
@Service("sls_ProductService")public class ProductService {@Autowiredprivate DataManager dataManager; // 插入代碼段時,默認注入帶有權限檢查的 DataManagerpublic List<Product> getProductsCheaperThan(Double price){// 注意 , 這里我們并沒有對輸入參數 price 做檢查List<Product> productList = dataManager.load(Product.class).query("select p from sls_Product p " +"where p.price < :priceInput").parameter("priceInput", price).list();return productList;}}
這里的加載實體列表代碼,我們通過 Studio 的代碼段功能自動添加 。
服務中,我們使用了 Jmix 的 DataManager 和 JPQL 查詢語句加載實體 , 并使用方法的輸入參數作為 JPQL 的參數 。Jmix 的持久層也支持 Spring Data Repository 或者 MyBatis 。而使用 DataManager 的一個好處是可以利用 Jmix 的安全機制,控制 API 調用方對實體的訪問權限 。
Jmix 服務 APIJmix 服務(Service) API 可以將任意 Spring bean 作為 HTTP 接口開放 。Jmix 負責 HTTP 交互,例如 , 提供 HTTP 響應編碼、進行錯誤處理等 。下圖是 Jmix 服務 API 的流程圖:
Jmix 中 REST API 的兩種實現

文章插圖
可以看到,作為應用程序開發者,僅需要編寫服務代碼 。另外,還需做一些配置:
  1. 在項目的 resources 目錄添加 rest-services.xml,用于配置可作為 REST API 使用的服務及其方法 , 內容如下:
<?xml version="1.0" encoding="UTF-8"?><services xmlns="http://jmix.io/schema/rest/services"><service name="sls_ProductService"> <!-- 指定服務名稱 --><method name="getProductsCheaperThan"> <!-- 指定方法名稱 --><param name="price" type="java.lang.Double"/> <!-- 指定方法參數和類型 --></method><!-- 可以添加服務中其他方法 --></service><!-- 可以添加其他服務 --></services>
  1. 在項目的 application.properties 文件中,設置 jmix.rest.services-config 參數,指定上面配置的 xml 文件:
jmix.rest.services-config = com/abmcode/sales/rest-services.xml完成這些配置之后,就可以通過 REST 客戶端調用了,URL 為 /rest/services/<service_name>/<method_name> 。例如,通過 Postman 調用:
Jmix 中 REST API 的兩種實現

文章插圖
服務 API 會默認使用 Jmix 的安全機制:API 端口需要使用認證 token 進行訪問,而且用戶需要有訪問 REST API 和所查詢實體的權限 。另外,Jmix 的服務 API 也支持匿名訪問 。

推薦閱讀