1. 框架简介
1.1 什么是CAP?
CAP(Cloud Application Programming)是SAP推出的一种现代化开发框架,旨在简化和加速云原生应用程序的开发。
CAP框架基于开放标准和技术,如Node.js、Java、OData和SQL,提供了一套工具和库,帮助开发人员快速构建、扩展和运行企业级应用。
1.2 CAP的基础技术框架
CAP框架主要由以下几个部分组成:
- CDS(Core Data Services):用于定义数据模型和服务的领域特定语言(DSL)。
- Node.js/Java:CAP支持两种编程语言,开发人员可以选择使用Node.js或Java来编写业务逻辑。
- OData:在CAP框架下,可以通过CDS语言自动生成OData服务。
- SQL:CAP支持多种数据库,包括SAPHANA、SQLite等。
1.3 CAP的开发模式
CAP的开发模式主要包括以下几个步骤:
- 定义数据模型:使用CDS语言定义数据模型。
- 定义服务:使用CDS语言定义服务接口。
- 实现业务逻辑:使用Node.js或Java实现业务逻辑。
- 部署和运行:将应用部署到SAP BTP(Business Technology Platform)或其他支持的环境中。
2. 学习资料与学习路径
2.1 官方文档
通过SAP CAP的官方文档 https://cap.cloud.sap/docs/,可以快速学习和了解CAP的开发知识。在官方文档中,提供了从入门到高级的各种教程,涵盖了 CAP 框架的各个方面,如数据建模、服务定义、业务逻辑实现、测试和部署等。
一个无用的知识:在CAP的官方文档上,我们可以看到cap>ire这样一个log,CAPIRE 这个名字其实来源于意大利语,意思是“理解”。
2.2 学习路径
学习 SAP CAP(Cloud Application Programming)框架可以分为几个阶段,从基础知识到高级应用。
- 对于从ABAP开发转为CAP开发的小伙伴,在正式开启CAP领域前,最好先了解
SAP BTP
的基本概念和服务,同时补齐JAVA
或Node.js
的一些基础语法知识。 - 在此基础上,学习CDS(Core Data Services)语言的语法和用法,了解如何定义数据模型和服务。
- 了解了CDS语言后,可以参照官方文档中的示例,创建一个简单的CAP项目,从而了解CAP项目的基本结构,以及各个文件的作用,同时学习使用CAP的命令行工具CLI来创建和管理项目。
- 完成上述学习后,基本上算是CAP入门了。在此基础上,可以进一步探索CAP的高阶功能,例如身份验证、授权、应用的部署等等。
同时, 学习SAPUI5 和 Fiori Elements技术对于 SAP CAP 中的应用程序开发也是非常有帮助。
因为:CAP 框架主要负责后端服务和业务逻辑,而 SAPUI5 和 Fiori Elements 则用于构建前端用户界面。
- 使用 CAP 框架定义数据模型和服务,处理业务逻辑和数据持久化。
- 使用 SAPUI5 或 Fiori Elements 构建用户界面,消费 CAP 提供的 OData 服务。
2.3 RAP vs. CAP
如果传统的ABAP开发接触过RAP框架的话,其实学习CAP框架还是相对容易的。虽然它们面向的技术栈和应用场景有所不同,但在设计理念和某些技术上有相似之处。
RAP与CAP有以下的相似点:
- 面向服务的架构:两者都采用面向服务的架构,强调通过服务接口(如 OData)来访问和操作数据。
- 数据建模:两者都使用领域特定语言(DSL)来定义数据模型和服务接口。CAP 使用
CDS(Core Data Services)
,而 RAP 使用ABAP CDS
。 - 业务逻辑分层:两者都强调业务逻辑的分层和模块化,支持在不同层次上实现业务逻辑。
- 开放标准:两者都基于开放标准和协议,如
OData
和RESTful API
,便于集成和扩展。
若比较一下RAP与CAP的技术栈,可以发现如下的相似点:
- 开发语言:
- CAP:主要使用 JavaScript(Node.js)或 Java 来实现业务逻辑。
- RAP:使用 ABAP 语言来实现业务逻辑。
- 开发工具:
- CAP:使用
Visual Studio Code
或SAP BAS
等发工具,结合CAP CLI
进行项目管理。 - RAP:使用
ABAP Development Tools(ADT)
和SAP BAS
进行开发。
- CAP:使用
- 部署环境:
- CAP:主要部署在
SAP BTP(Business Technology Platform)
上,支持多种云环境。 - RAP:主要部署在
SAP S/4HANA
系统中,适用于内部部署和云部署。
- CAP:主要部署在
下面用一个小例子对比了RAP 和 CAP的相似性和不同点:
2.3.1 RAP
ABAP CDS 数据模型:
@EndUserText.label: 'Books'
@AbapCatalog.enhancementCategory: #NOT_EXTENSIBLE
@AccessControl.authorizationCheck: #NOT_REQUIRED
@Metadata.allowExtensions: true
define root view entity ZI_Books
{
key ID : abap.int4;
title : abap.string(100);
author : abap.string(100);
stock : abap.int4;
}
服务定义:
@EndUserText.label: 'Catalog Service'
define service ZC_CatalogService
{
expose ZI_Books as Books;
}
业务逻辑(ABAP 类):
CLASS zcl_catalog_service DEFINITION
PUBLIC
FINAL
CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES: if_rap_query_provider,
if_rap_modify_provider.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS zcl_catalog_service IMPLEMENTATION.
METHOD if_rap_query_provider~select.
" Implement query logic here
ENDMETHOD.
METHOD if_rap_modify_provider~create.
" Implement create logic here
ENDMETHOD.
ENDCLASS.
2.3.2 CAP
CDS 数据模型(schema.cds):
namespace my.bookshop;
entity Books {
key ID : Integer;
title : String;
author : String;
stock : Integer;
}
服务定义(service.cds):
using { my.bookshop as my } from './schema';
service CatalogService {
entity Books as projection on my.Books;
}
业务逻辑(catalog-service.js):
const cds = require('@sap/cds');
module.exports = cds.service.impl(async function() {
const { Books } = this.entities;
this.after('READ', 'Books', each => {
if (each.stock > 111) {
each.title += ' -- 11% discount!';
}
});
this.on('CREATE', 'Books', async req => {
const { ID, title, author, stock } = req.data;
if (stock < 0) {
req.reject(400, 'Stock cannot be negative');
}
await INSERT.into(Books).entries({ ID, title, author, stock });
});
});
3. 小结
本文介绍了SAP CAP框架的基础知识,并结合ABAP技术栈的特点,给出了CAP建议的学习路径。