Jmix 中 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 也支持匿名访问 。
Spring 控制器 API然后我们再看看 Spring 的 RestController 方式 。首先 , 我们定义一个控制器:
@RestController("sls_ProductController")@RequestMapping("/products")public class ProductController {@Autowiredprivate ProductService productService;@GetMapping("priceunder")public List<Product> getPriceUnder(@RequestParam Double price) throws Throwable {if (price < 0) {throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "价格参数必须大于 0"); // 自定义控制器层的参数检查 , 抛出请求异常 。}return productService.getProductsCheaperThan(price);}}Jmix 中的控制器接口默认都是匿名的 , 但是为匿名用户配置能访问实体信息又不够安全 , Jmix 提供了一个应用程序属性 , 支持使用 Jmix 安全机制对自定义控制器进行保护:
# 支持逗号分隔的多个 patternjmix.rest.authenticatedUrlPatterns=/products/**然后 , 重启服务就可以通过 Postman 进行调用 。注意 , 这里的 URL 与服务 URL 不同 , 直接使用了控制器中定义的路径:
Jmix 中 REST API 的两种实现

文章插图
结论通过上面的代码 , 我们可以看到 , 在 Jmix 中使用两种类型的 REST API 其实都不复杂 , 但是 , 也是各有优势:
Jmix 服务 API:
  • 不用编写控制器代码 , 仅通过 XML 配置即可使用
  • 默认使用 Jmix 的安全机制
  • 可以使用 Fetch plan 定义返回实体的字段
Spring 控制器:
  • 更加灵活 , 可以使用 Spring 控制器自定义 HTTP 状态码、响应类型或者异常错误
  • 除了使用服务层的实体控制外 , 还可以在控制器层使用自定义的 DTO 对返回实体的信息做进一步控制
因此 , 在大多数情况下 , 我们仅使用 Jmix 的服务 API 就能够满足使用要求 。针对部分复杂场景可以使用 Spring 控制器 API 。
文中使用的 Jmix 版本:1.3.1

经验总结扩展阅读