cuba 平台_CUBA平台:TypeScript SDK和REST API

cuba 平台

在本文中,我们将讨论已存在很长时间但尚未广为人知的CUBA平台的功能- 前端SDK生成器 ,并了解它如何与CUBA的REST API插件一起使用 。

Java + JavaScript –网络婚姻

仅八年前,我们Java开发人员在我们的Web应用程序中使用JavaScript作为“第二等公民”语言。 那时,它的目的是通过JSF,Struts,Tapestry或Thymeleaf等框架向服务器端生成的网页添加一些动态。 如今,我们见证了JavaScript的出现,它是使用React,Vue或Angular等框架进行客户端开发的第一语言,而Node.js甚至可以将其引入服务器端。

实际上,我们开发的Web应用程序可能在不同的层上使用不同的语言:JavaScript用于客户端UI,Java用于业务逻辑处理,SQL用于从数据库中获取数据,Python用于数据分析,等等。使用各种技术将所有这些语言组合到一个应用程序中。 最常见的示例– REST API。 基于与平台无关的HTTP协议和简单的JSON格式,现在它是拼接客户端JS和服务器端Java的默认方法。

但是即使是最好的针脚也不能无缝。 API定义始终存在一个问题:要调用的方法,数据模型是什么以及我们应该将街道地址作为结构化对象还是作为字符串传递。

我们如何才能帮助我们JavaScript研究员更快地创建代码并避免沟通不畅?

Swagger是最终答案吗?

你说“ 招摇 ”,对。 Swagger实际上是用于设计,构建,记录和使用REST API的工业标准。 有许多代码生成器可帮助生成用于不同语言的客户端SDK。

CUBA Framework支持Swagger,每个带有REST API插件的应用程序都有一个端点,该端点允许下载.json或.yaml格式的Swagger文档。 您可以使用这些文件来生成JS客户端。

请考虑以下事实:Swagger只是一个API文档工具。 但是,前端开发人员希望在API中看到什么样的信息? “经典”方法是:将业务功能映射到服务并构建定义良好的API。 然后将其公开为一组REST服务,添加Swagger文档并享受。

那么,为什么GraphQL赶上趋势,在前端开发人员中引起轰动? 并注意GraphQL在Web API世界中的份额正在增长。 到底是怎么回事? 事实证明,有时为前端开发人员提供更多“通用” API会更容易,从而避免为可能经常更改的用例创建很多小型API。 例如,在Web UI中,对于您的购物篮,您只需要先订购价格,然后再订购总额的订单,依此类推。GraphQL还是一个​​很好的工具,可以避免过度获取和获取不足,以及一次查询多个API以获得一个复杂的数据结构。

好的,看起来应用程序不仅应该公开服务,还应该公开一些通用API。 这种方法允许前端开发人员调用复杂的业务功能,并为他们提供一定程度的灵活性,因此,如果他们只需要UI的不同数据表示形式,则他们不会请求更改API。

Swagger或GraphQL或OData都无法解决另一个问题-如果更改了某些内容,该如何处理生成的客户端代码。 直接的一次性代码生成很简单,但是支持却是另一回事。 在删除实体的属性后,如何确保前端应用程序不会失败?

因此,为了加速前端开发并简化后端团队和前端团队之间的协作,我们需要:

  1. 公开特定于业务的API和通用API
  2. 根据后端数据模型和方法签名生成前端代码
  3. 以最小的努力和潜在的错误修改生成的代码

我们在REST中使用REST API附加组件和前端SDK生成器来面对所有这些挑战。

CUBA TypeScript SDK

在CUBA中,REST API附加组件提供以下功能:

  • 数据模型上的CRUD操作
  • 执行预定义的JPQL查询
  • 执行服务方法
  • 获取元数据(实体,视图,枚举,数据类型)
  • 获取当前用户权限(访问实体,属性,特定权限)
  • 获取当前的用户信息(名称,语言,时区等)
  • 处理文件

因此,我们拥有从任何前端客户端使用该应用程序所需的一切。 所有这些API都在不拘一格的YAML或JSON文件中进行了描述,因此您可以立即开始实施该应用程序。

为REST API用户设置安全规则对于防止意外的端点暴露给所有用户非常重要。 首先,拒绝所有用户的常规REST API访问,然后为需要访问所需功能的角色创建特殊权限。

但是CUBA不仅提供REST API。 您可以生成一个SDK , 该SDK可以用作任何前端开发框架的基础:React,Angular,Vue或其他。

使用生成器,您可以创建一组TypeScript类,该类允许您从客户端应用程序调用CUBA API。

要生成SDK,您只需运行

 npm install -g @cuba -platform/front-generator 

然后

 gen-cuba-front sdk:all 

所有课程将为您创建。 您甚至可以基于ReactJS生成一个简单的UI,因此您的客户将能够立即开始使用基于CUBA的应用程序。 用户界面非常基本,但是使用CUBA,您将立即获得所有功能,包括身份验证,基于角色的数据访问,实体图检索等。

让我们仔细看一下SDK的功能。

资料模型

应用程序数据模型表示为TypeScript类的集合。 如果我们看一下QuickStart中使用的Session Planner应用程序,则那里有一个实体:

 @NamePattern ( "%s %s|firstName,lastName" )  @Table (name = "SESSIONPLANNER_SPEAKER" )  @Entity (name = "sessionplanner_Speaker" )  public class Speaker extends StandardEntity { @NotNull @Column (name = "FIRST_NAME" , nullable = false ) protected String firstName; @Column (name = "LAST_NAME" ) protected String lastName; @Email @NotNull @Column (name = "EMAIL" , nullable = false , unique = true ) protected String email;  //Setters and getters here  } 

在SDK中,我们将获得一个类:

 export class Speaker extends StandardEntity { static NAME = "sessionplanner_Speaker" ; firstName?: string | null ; lastName?: string | null ; email?: string | null ;  } 

所有关联和组成都将被保留,因此您将能够获取实体图,而不必使用多个API调用一一获取实体。

不再需要DTO-您将获得与后端所述完全相同的数据。

商业服务

通过CUBA中的REST公开的所有服务将在SDK中具有TypeScript表示形式。 例如,如果我们使用REST API公开会话服务 ,您将获得一个如下所示的TypeScript代码:

 export var restServices = { sessionplanner_SessionService: { rescheduleSession: (cubaApp: CubaApp, fetchOpts?: FetchOptions) => (params: sessionplanner_SessionService_rescheduleSession_params) => { return cubaApp.invokeService( "sessionplanner_SessionService" , "rescheduleSession" , params, fetchOpts); } }  }; 

因此,您只需编写以下行就可以从UI调用它:

 restServices.sessionplanner_SessionService.rescheduleSession(cubaREST)({session, newStartDate}).then( (result) => { //Result handling  }); 

方便,不是吗? 所有常规工作都为您完成。

通用API

如果仅需要为前端实现自定义逻辑,则始终可以使用在核心CUBA平台REST库中定义的一组功能,例如:

 loadEntities<T>(entityName: string, options?: EntitiesLoadOptions, fetchOptions?: FetchOptions): Promise<Array<SerializedEntity<T>>>;  deleteEntity(entityName: string, id: any, fetchOptions?: FetchOptions): Promise< void >; 

这些功能使您可以使用应用程序中的实体对CRUD操作进行细粒度的访问。 安全性仍然存在,CUBA在服务器端验证所有非匿名调用,并防止获取不符合用户角色的实体或属性。

 cubaREST.loadEntities<Speaker>(Speaker.NAME).then( (result => { //Result handling  })); 

使用此通用API,开发人员可以使用在通用CRUD上创建的自定义API层创建JS应用程序,并将其部署到实现“ 后端前端 ”架构模式的node.js服务器。 而且,用这种方法可能实现了多个API层,我们可以为不同的客户端实现一组不同的API:ReactJS,Native iOS等。实际上,生成的SDK是此用例的理想工具。

通用API的不好之处在于,当您获取的属性超出了所需的属性或者API描述符中的属性不足时,可能会导致数据获取不足或获取过多的风险。 CUBA的实体视图在后端解决了这个问题,我们为前端开发人员提供了相同的选择! 对于每个生成的TypeScript类,我们创建反映视图的类型:

 export type SpeakerViewName = "_minimal" | "_local" | "_base" ;  export type SpeakerView<V extends SpeakerViewName> =  V extends "_minimal" ? Pick<Speaker, ? Pick<Speaker, "id" | "firstName" | "lastName" > :  V extends "_local" ? Pick<Speaker, ? Pick<Speaker, "id" | "firstName" | "lastName" | "email" > :  V extends "_base" ? Pick<Speaker, ? Pick<Speaker, "id" | "firstName" | "lastName" | "email" > :  never; 

因此,您可以从后端获取实体,并且只会获取指定的属性。 因此,您无需猜测提取了哪些属性。 IDE将帮助您自动完成代码。

API更新

如前所述,代码生成甚至不占开发工作的一半。 更改和支持代码是大多数工作要做的地方。 CUBA的TypeScript SDK生成器在后续运行期间分析代码,跟踪更改并以增量方式对其进行更新。 如果您将TypeScript用作前端的主要开发语言,TypeScript编译器将确保您不会忘记更新使用SDK的自定义代码。

结论

除了通用UI之外,如果您还想为CUBA应用程序开发基于JS的客户端UI(React / React Native或Angular或Vue),则可以使用REST API插件和TypeScript SDK。 无论您决定使用哪种技术,都可以专注于设计或性能以提供最佳的用户体验,而不必执行常规的编码任务。 而且,您可以确定JS到Java的通信以及对不断变化的API的支持将是您遇到的最小问题。

翻译自: https://www.javacodegeeks.com/2019/11/cuba-platform-typescript-sdk-and-rest-api.html

cuba 平台

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331492.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法八之归并排序

一、归并排序原理 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每个子序…

数据库编程——intro to JDBC

【0】README 1&#xff09; 本文文字描述 转自 core java volume 2 &#xff0c; 旨在理解 数据库编程——JDBC 的基础知识 &#xff1b; 2&#xff09;JDBC起源&#xff1a; 96年&#xff0c; Sun公司发布了 第一版的java 数据库连接&#xff08;JDBC&#xff09;API&#…

java \t怎么从头开始_通过这些简单的步骤从头开始学习Java

java \t怎么从头开始Java是用于软件开发的最受欢迎的编程语言之一。 无论您的最终目标或技能水平如何&#xff0c;学习和掌握Java都将为您作为开发人员打开大门。 今天&#xff0c;我们将讨论一些原因&#xff0c;我们认为您应该开始学习Java&#xff0c;然后提供有关入门的深入…

HDFS 的dao

一、HDFS dao接口package cn.mk.dao;import java.io.FileNotFoundException; import java.io.IOException;import org.apache.hadoop.fs.BlockLocation; import org.apache.hadoop.fs.FileStatus;public interface HDFSDao {public boolean mkDirs(String path) throws IOExcep…

数据库编程——JDBC 配置

【0】README 1&#xff09; 本文文字描述 转自 core java volume 2 &#xff0c; 旨在理解 数据库编程——JDBC 配置 的基础知识 &#xff1b; 2&#xff09; update timestamp: 1602022101&#xff1b; 更新内容有&#xff1a; 上传了一些图片&#xff0c; 而且举证说明了 为…

使用互联网了解的两个月里_我两个月来对Quarkus的了解

使用互联网了解的两个月里又一年&#xff0c;另一个来临&#xff0c;我很荣幸再次开启围绕Java&#xff0c;语言&#xff0c;生态系统和朋友的24篇精彩博客文章的统治&#xff0c;这些博客文章将我们所有人带入了今年最安静的假期。 这已经是第五年了&#xff08;我只错过了201…

javah导出类的头文件抛出异常——java.lang.IllegalArgumentException: Not a valid class name(原因及解决方法)

【0】README 0.1&#xff09; 本文旨在给出 java.lang.IllegalArgumentException 异常的原因 和 处理方法&#xff0c; 该异常和 javah 没有半毛钱关系 &#xff1b; 0.2&#xff09; 本文附带地给出了 javah 的作用 和 java 调用本地代码&#xff08;如 C语言&#xff09;的…

使用阿里巴巴json映射_使用JSON模式验证来映射稀疏JSON

使用阿里巴巴json映射在本文中&#xff0c;我们将探讨在创建和共享API时出现的问题。 特别是&#xff0c;需要&#xff1a; 表达数据的结构 提供对该数据的验证 允许将来改变主意 通过您拥有的部分数据与客户进行沟通 缺少数据时填写空白 人们通常使用版本编号的API解决此…

本地方法(JNI)——从java 程序中调用C函数

【0】README 1&#xff09; 本文部分文字描述 转自 core java volume 2 &#xff0c; 旨在理解 本地方法——从java 程序中调用C函数 的基础知识 &#xff1b; 2&#xff09; for source code, please visit https://github.com/pacosonTang/core-java-volume/tree/master/co…

Hadoop入门(一)概念与单机安装

一、hadoop的概念 &#xff08;1&#xff09;什么是大数据 大数据是不能用传统的计算技术处理的大型数据集的集合。它不是一个单一的技术或工具&#xff0c;而是涉及的业务和技术的许多领域。 &#xff08;2&#xff09;hadoop的定义 Hadoop是一个由Apache基金会所开发的分布式…

螺旋测微器 flash_使用测微计收集应用程序指标

螺旋测微器 flash什么是Micrometer&#xff1f; Micrometer是一个简单的外观&#xff0c;用于以供应商中立的方式收集Java应用程序中的指标。 您可以考虑使用SLF4J作为指标。 Micrometer内置了对许多不同指标后端的内置支持&#xff0c;包括Atlas&#xff0c;Datadog&#xff0…

java JNI调用C语言动态链接库(java.lang.UnsatisfiedLinkError: no yourClassName in java.library.path 异常的解决方法)

转自&#xff1a; http://watershitter.iteye.com/blog/477615今天花了至少3个小时跑这个java调c的动态链接库的Hello&#xff0c;native world的程序。 把所有犯的错误和要点总结一下! 1 java 中 c语言函数的声明 public native static void greeting(); //就像是接口声明一样…

Hadoop入门(二)集群安装

一、集群安装条件前置 在虚拟机上先准备一个机子 按用前面【安装单机hadoop】 已完成安装jdk,hadoop和ssh、网络等配置环境等。 虚拟机和操作系统 环境&#xff1a;ubuntu14 hadoop2.6jdk1.7ssh 虚拟机&#xff1a;&#xff08;vmware10&#xff09; 二、集群安装环境设置…

poj doubles_余数运算符在Java中用于Doubles

poj doubles我在OSU任教已近两年了&#xff0c;这总是令我惊讶&#xff0c;我从学生那里学到了多少。 例如&#xff0c;过去&#xff0c; 我让学生写一些我不理解的奇怪代码 。 在这一点上&#xff0c;即使经过300多个博客文章&#xff0c; 几个YouTube视频 &#xff0c;甚至还…

面向对象与面向过程

一、面向过程编程 面向过程编程是一种以过程为中心的编程思想,分析出解决问题的步骤&#xff0c;然后用函数把这些步骤一步一步实现。面向过程编程&#xff0c;数据和对数据的操作是分离的。二、面向对象编程 面向对象编程是将事物对象化&#xff0c;通过对象通信来解决问题。面…

本地方法(JNI)——数值参数与返回值

【0】README 1&#xff09; 本文部分文字描述 转自 core java volume 2 &#xff0c; 旨在理解 本地方法&#xff08;JNI&#xff09;——数值参数与返回值 的基础知识 &#xff1b; 2&#xff09; for source code, please visit https://github.com/pacosonTang/core-java…

class employe_Java 8 –集合sort()方法–按Employe对象(Id,名称,年龄)列出自定义排序示例

class employe有关在Java中对自定义对象进行排序的完整指南。 Collections.sort&#xff08;&#xff09;方法基于Comparable或Comparator实现进行排序。 用于对Employee对象进行排序的示例自定义排序 1.简介 在本教程中&#xff0c;您将学习如何在java中对Custom对象进行排序…

Spring入门(一)之简介

一、Spring定义 Spring是一个开源框架&#xff0c;Spring是于2003 年兴起的一个轻量级的Java 开发框架&#xff0c;由Rod Johnson创建。 简单来说&#xff0c;Spring是一个分层的JavaSE/javaEE full-stack(全栈的) 轻量级开源框架。 二、Spring框架特征 &#xff08;1&#xff…

本地方法(JNI)——访问域+字符串参数

【0】README 1&#xff09; 本文部分文字描述 转自 core java volume 2 &#xff0c; 旨在理解 本地方法&#xff08;JNI&#xff09;——访问域字符串参数 的基础知识 &#xff1b; 2&#xff09; for source code, please visit https://github.com/pacosonTang/core-java…

aws上负载均衡器标组端口_AWS CloudFormation:目标组没有关联的负载均衡器

aws上负载均衡器标组端口昨天&#xff0c;我使用AWS CloudFormation模板最终创建了ECS服务&#xff08;Fargate类型&#xff09;&#xff0c;还创建了包括应用程序负载均衡器&#xff0c;目标组和IAM角色的资源。 创建堆栈时&#xff0c;出现以下错误&#xff1a; 具有target…