CUBA平台:TypeScript SDK和REST API

在本文中,我们将讨论已存在很长时间但尚未广为人知的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

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

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

相关文章

wifiphisher 依赖_铂瑞思:总是依赖别人的话,就永远也长不大

我们每个人都会或多或少的对他人产生依赖&#xff0c;依赖一词&#xff0c;可被定义为过度需要依靠他人的支持、指导、照顾和保护。但一部分人由于形成了与他人不同的思维与行为模式&#xff0c;导致了依赖型人格障碍的产生。依赖性人格障碍以过分依赖为特征&#xff0c;表现为…

米兔机器人自主编程_978个零件+自主编程,米兔机器人价格仅为友商八分之一...

作为一个“大孩子”&#xff0c;我也喜欢拼积木&#xff0c;看重了一款乐高的可变性积木竟然售价4000多&#xff0c;太贵了&#xff0c;实在买不起。然后就搜索到了小米的这款米兔儿童机器人&#xff0c;性能上能达到乐高95%以上&#xff0c;价格却只有八分之一&#xff0c;果断…

网站开发用什么语言好_网站开发教程:企业如何用网站开启在线业务?

用网站来开启互联网在线业务是很好的方法&#xff0c;对于创业型企业来说&#xff0c;进行自己的企业网站开发制作能够加快实现品牌业务目标。下面这个教程将会教你如何开展在线业务、并利用网站来扩大业务&#xff01;1.确定目标市场创业团队需要明确自己的目标市场&#xff0…

c语言字符指针初始化赋值,C语言_指针变量的赋值与运算,很详细详解

指针变量的赋值指针变量同普通变量一样&#xff0c;使用之前不仅要定义说明&#xff0c; 而且必须赋予具体的值。未经赋值的指针变量不能使用&#xff0c; 否则将造成系统混乱&#xff0c;甚至死机。指针变量的赋值只能赋予地址&#xff0c; 决不能赋予任何其它数据&#xff0c…

ospf工作原理_OSPF动态路由配置经典案例

前导知识点&#xff1a;静态路由结合上一讲讲解的距离矢量路由协议&#xff0c;本讲我们讲解链路状态路由协议----OSPF&#xff0c;相比较于RIP&#xff0c;OSPF能够支持大型网络&#xff0c;下面列出RIP和OSPF的对比图&#xff0c;进一步说明了OSPF的强大。RIP最多支持15台路由…

gridview ashx实现数据更新_Python分析了香港26281套在售二手房数据,结果发现

作者&#xff1a;J哥背景香港的贫富差距问题一直十分尖锐&#xff0c;最突出的体现就是收入和楼价的巨大差异。早在60年代末香港房价就经历了暴涨&#xff0c;人们早已对不动产的金融属性了如指掌&#xff0c;全港的投资情绪一直都相当火热。即便香港当前失业率高企&#xff0c…

线性单链表存储结构c语言代码,单链表定义-(线性表的链表存储结构)

线性表分为:顺序存储结构和连存储结构顺序存储结构的优点:1.空间利用率高,几乎不需要额外的空间开销.2.数据的逻辑结构和物理结构完全一致.3.结点地址计算的时间和线性表的规模大小无关.4.可以用一维数组实现存储.但是有两个致命的缺点:1.顺序存储结构的存储空间是静态分配,必须…

idea 自动生成mybaits_怎么让idea自动创建mybatis配置文件

已采纳一、在pom.xml中添加plugin其中generatorConfig.xml的位置&#xff0c;大家根据实际情况自行调整二、generatorConfig.xml配置文件1 <?xml version"1.0" encoding"UTF-8"?>2 /p>3 PUBLIC "-//mybatis.org//DTD MyBatis Generator Co…

奇奇seo优化软件_西藏seo关键词优化软件

西藏seoxaa0c1关键词优化软件&#xff0c;网站在建立时搜索引擎是较为完善的基本上是不太需要长期进行优化的&#xff0c;但是近几年搜索引擎优化的频率开始增加&#xff0c;这让人有些好奇&#xff0c;搜索引擎优化的目的是什么&#xff1f;为什么受企业欢迎呢&#xff1f;网站…

c语言出现源文件未编译,dev运行C语言出问题

dev运行时出现源文件未编译的情况是什么原因&#xff0c;应该怎么样解决呢#include int main(){int day,month,year,sum,leap;printf("\n请输入年、月、日&#xff0c;格式为&#xff1a;年,月,日(2015,12,10)\n");scanf("%d,%d,%d",&year,&month,…

学习理发去哪里_学习美发去哪里学

于是你会发现&#xff0c;和师傅学的这条路走不通&#xff0c;只是学了些二把刀的技术&#xff0c;混混小店还行&#xff0c;大店那更是遥不可及的事情。这次你终于下定决心&#xff0c;准备到学校去学学看&#xff0c;可是真正要学的时候你才发现&#xff0c;选择学校比去美发…

lucene自动补全_使用自动机的Lucene新的邻近查询

lucene自动补全最简单的Apache Lucene查询TermQuery匹配包含指定术语的任何文档&#xff0c;无论该术语出现在每个文档中的何处 。 使用BooleanQuery可以将多个TermQuery组合在一起&#xff0c;并完全控制哪些术语是可选的&#xff08; SHOULD &#xff09;和哪些是必需的&…

npm install 报错 汇总_2020年特岗教师招聘征集志愿人员资格复审、面试公告汇总...

原标题&#xff1a;2020年特岗教师招聘征集志愿人员资格复审、面试公告汇总昨天晚上安徽省2020年特岗教师招聘空缺计划征集志愿拟参加面试人员名单已经公布啦&#xff0c;接下来陆续就是资格复审和面试啦小可爱们一点要关注各地复审时间啊2020年特岗教师招聘征集志愿人员资格复…

用c语言计算sin x 的值,用泰勒公式求sin(x)的近似值

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include #include #define PI 3.1415927double FACT(double x);double fact(int n);int main(){int n,i,k,flag;double x,sin,temp,index;while(scanf("%lf%d",&x,&n)!EOF){FACT(x);flag1; index0.1; tempx; si…

pb 调用虹软_python调用虹软2.0

1 from ctypes import *2 #人脸框3 class MRECT(Structure):4 _fields_[(uleft1,c_int32),(utop1,c_int32),(uright1,c_int32),(ubottom1,c_int32)]5 #版本信息 版本号,构建日期,版权说明6 class ASF_VERSION(Structure):7 _fields_[(Version,c_char_p),(BuildDate,c_char_p),(…

使用Java和JSF构建一个简单的CRUD应用

使用Okta的身份管理平台轻松部署您的应用程序 使用Okta的API在几分钟之内即可对任何应用程序中的用户进行身份验证&#xff0c;管理和保护。 今天尝试Okta。 JavaServer Faces&#xff08;JSF&#xff09;是用于构建Web应用程序的Java框架&#xff0c;其中心是作为用户界面构建…

ftp 传输速度_ftp上传工具下载,8款优秀的ftp上传工具下载软件

FTP上传工具现在有很多种&#xff0c;而且各有各的特点&#xff0c;至于FTP上传工具哪个好用呢&#xff1f;小编认为萝卜白菜各有所爱&#xff0c;看个人喜好&#xff0c;还结合服务器和各种功能方面的需求。小编用的就是iis7服务器管理工具&#xff0c;比较方便而且功能不错&a…

c语言实践教程实验题答案,C语言课后实验教程习题答案

第5章以后的答案第五章答案-1-1. 【答案】&#xff1a; (1) m1 n2 (2) m2 n3 (3) a>0 并且a2. 【答案】&#xff1a;(2)for (i0;i<10;i) {……} 3. 【答案】&#xff1a;32 4. 【答案】&#xff1a; main() {char x ;int y;printf("please input :");scanf(&qu…

t分布 u分布 卡方分布_中心极限定理|z分布|t分布|卡方分布

生物统计学抽样分布&#xff1a;n个样本会得到n个统计量&#xff0c;将这n个统计量作为总体&#xff0c;该总体的分布即是抽样分布根据辛钦大数定律&#xff0c;从一个非正态分布的总体中抽取的含量主n的样本&#xff0c;当n充分大时&#xff0c;样本平均数渐近服从正态分布。因…

java ee打印功能_Java EE:异步构造和功能

java ee打印功能介绍 Java EE具有许多API和构造以支持异步执行。 从可伸缩性和性能的角度来看&#xff0c;这是至关重要的。 让我们假设2个模块相互交互。 当模块A &#xff08;发送方&#xff09;以同步方式向模块B &#xff08;接收方&#xff09;发送消息时&#xff0c;通信…