ODATA是Fiori和SAP的纽带,前端的开发不需要了解ABAP,后端的ABAP也不需要了解SAPUI5, 但是他们都需要了解ODATA,今天就来详细总结一下ODATA
概念
OData
OData 全称是Open Data Protocol, 即开放数据协议 ,它的主要用途便是通过Web来对数据库中的数据进行查询与更新 。
OData其实不是SAP所创,他是一个设计和使用RESTful API的标准协议(就是大家都要准守的规则,只要你按这个标准创建RESTful API,其它组织都可以按照OData标准中定义的方式去使用这个API获取/修改资源,就像是SQL标准和数据库之间的关系)。OData就是一个接口,基于HTTP(S)协议,各种程序和系统都可以互联互通,执行读、写、改等操作,这样SAP外部的程序就可以操作SAP的数据,甚至调用BAPI等等。相当于SAP对外又开放了一个接口,这个接口基于ODATA协议,这个接口就是SAP Netweaver Gateway。换句话说OData开放和分享了SAP的数据,这样就可以开发基于Web和Mobile的程序而不用考虑Web程序和Mobile应用是用什么技术开发的了,实现了SAP Fiori的跨平台特性。OData协议支持一系列流行的数据格式,包括JSON,XML。


REST
REpresentational State Transfer,REST其实就是所有的数据操作都是通过客户端发送的一系列URI来完成,URL定位资源,用HTTP动词(GET,POST,DELETE,DETC)描述操作。

| OData Operation | HTTP Method | What it meant to an ABAPer |
|---|---|---|
| Create | POST | Insert |
| Read | GET | Select Single * From |
| Update | PUT/PATCH | Update |
| Delete | DELETE | Delete from |
| Query | GET | Select *? From |
| Function Import | GET/POST | Everything covered by GET and POST. But only use if scenario does not fit into CRUDQ operations. |
URI&URL&URN
Uniform Resource Identifier统一资源标识符
Uniform Resource Locator统一资源定位符
Universal Resource Name 统一资源名称
三者的关系:

URI是个纯粹的句法结构,用于指定标识Web资源的字符串的各个不同部分。也就是说,URI分为三种,URL or URN or (URL and URI),URL代表资源的路径地址,而URN代表资源的名称。通过URL和URN找到资源是对网络位置进行标识,就是URI,如:
- http://example.org/absolute/URI/with/absolute/path/to/resource.txt
- ftp://example.org/resource.txt
返回值:
日常开发中常遇到的是2xx 和 4xx 5xx,4xx就在开户的客户端找原因,5xx就在后端OData服务找原因。
ICM
- ICM Internet Communication Manager是SAP Netweaver Application Server的一个组件,负责接受和发送Web请求(HTTP,HTTPS,SMTP)它是以单独的进程实施的,并且由SAP Dispatcher启动和监听。可以通过Profile 参数进行配置。TCODE:SMICM

- SAP Web Dispatcher 和ICM用同样的基础代码,它们之间主要的不同是 Web Dispatcher在已连接的应用服务器上负责负载均衡并且传递请求给ICMs而不是亲自处理请求,它们可以共享Profile参数和管理选项。

上图是ICM的架构,1The Internet Communication Manager ensures that communication between the SAP System (SAP NetWeaver Application Server) and the outside world via HTTP, HTTPS and SMTP protocols works properly. In its role as a server, the ICM can process requests from the Internet that arrive as URLs with the server/port combination that the ICM can listen to. The ICM then calls the relevant local handler for the URL in question.
总之,ICM确保了SAP应用服务器和外界通过HTTP/HTTPS/SMTP协议的交互,ICM可以侦听并处理Internet以URLs(Server+Port组合)传来的请求,然后由ICM调用URL中请求中的本地相应的handler。
ICF
- ICF Internet Communication Framework 允许用户通过HTTP, HTTPS and SMTP协议与SAP系统进行通信,是应用服务器的一个集成组件。它有几个特点:1. 灵活性,通过ICF用户可从任何有互联网的地方连接到SAP系统。2.方便配置,只需要很简单的安装和配置就可以实现。3.安全性,HTTPS协议保证了数据传输的安全性,安全程度与RFC/SNC相当。
ICF提供了处理HTTP请求的基础结构,HTTP请求调用ICF Server中的一个服务,这个服务可以包含一个或多个负责执行ABAP功能的HTTP request handlers。
SAP提供很多标准功能对应的ICF Serivces和request handlers。
用户可以定义自己的HTTP request handlers和Services。
实例
今天我们就通过一个实例来介绍这三个问题:
- 怎么样就是创建了一个OData服务?
- OData服务怎么使用?
- 开发OData过程中应该注意什么?
Tcode:SEGW
方便大家记忆,SE(做为一个ABAPer最熟悉的开发TCODE都是以SE开头的,SE 38 SE 37,以后记再加一个SEGW)+ GW (G ateW ay)

1.创建或导入Data Model


我们可以看到,Gateway service 分为四个部分 (左边的 panel):
- Data Model: 数据模型,主要包括 Entity type,( 比如说 product entity,customer entity 等),Entity set (Entity 的集合,多笔数据) 和 Association (Entity 之间的关联)
- Service Implementation: Entity set 的 CRUD 实现
- Runtime Artifacts: 基于 Entity set 的代码框架,包括数据模型 (Data model),数据提供者 (Data provider)
- Service maintenance:注册服务,测试服务。
学习两个新名词:Entity Type 和 Entity Set ,实体类型和实体集,可以简单的理解 Entity Type 为 work area, 其中的Properties为work area的字段, Entity Set为Internal Table, Service implementation就是具体的数据操作方法。
2. 创建Data Model

这里我们通过Import的方式进行导入创建,当然也可以手工进行entity type和entityset的创建。
参考表SCARR创建名称为Airline的Entity。
选中需要的字段
指定Key字段
点击生成,相当于激活
可以看到系统将自动创建6个Class,bass class和Extended Class(EXT),其中EXT是我们将进行服务实现的类。如果不小心将代码写到了base class,那在下一次Generate时自开发代码将会被清空。
MPC和DPC
MPC:Model Provide Class
DPC: Data Provider Class
顾名思义,一个是定义数据模型的类,一个是定义和实现数据操作的类。
DPC提供了Gateway Service的方法实现,MPC提供了Gateway Service的接口,DPC和MPC的连接不是靠代码维系,而是通过配置。
到此为止,OATA Service创建完成。但这仅仅是创建的后端服务,前端想要使用这个服务还要将这个后端的服务注册到前端,也就是注册到Gateway Hub上,向外部暴露我们的OData Service。
3. 注册服务
TCODE:/IWFND/MAINT_SERVICE
这个Gateway的很多TCODE都是这种很长带斜杠的,还有一个常用的/IWFND/GW_CLIENT 这两个分别是Server和Client。自己想办法记忆吧

点击 ‘添加服务’
找到刚刚自己创建的‘项目名+ _ SRV’ 的服务,点击’add Service’

回到刚才的界面,可以通过filter来找到刚刚添加的服务,选中后点击下面的’SAP Gateway Client’(这里也可以通过刚说的TCODE:/IWFND/GW_CLIENT来启动)
测试服务

直接点击Execute,可以看到服务的测试结果,这里只是测试了服务是否连通,想要对数据的增删改,还要进行接下来的Method redefine.
服务实现
服务实现是指提供 CRUD 的具体实现,读取数据,SAP 一般把读取 Entity 叫做 Read,把读取 EntitySet 叫做 Query。在 SEGW 界面中 展开 Service Implementation:
Go to ABAP Workbenck
我们需要编写具体的代码,这样外部才能实现对 SAP 数据的增删改查。首先我们来看看 GetEntitySet 方法的编写过程。
Redifine激活后,我们再到SAP Gateway Client进行测试
对EntitySet的操作可以参考下表:
对Entity的操作也可以参考下表:
###参考