我的知识星球里有朋友提问:
想把SAP的一个UI5 demo APP和后台的ODATA连起来。在测试过程中发现两者使用的json格式不一样,在ODATA返回的json格式中多了一些内容,具体可以看附件。对这个不是很明白,想知道这个怎么转换,或者怎么配置实现?
从截图中我们能看到真实 OData 返回的数据里多了 __metadata 节点,里面包含了 id, uri 和 type 这几个字段。
在使用 ABAP 实现 SAP OData 服务时,返回的 JSON 数据中包含 __metadata 节点,这个节点的作用是提供实体的元数据信息,方便客户端应用程序使用和处理返回的数据。
__metadata 节点包含以下几个字段:
- id:实体的唯一标识符,可以通过该标识符唯一定位实体。
- uri:实体的 URI 地址,客户端应用程序可以通过该地址获取实体的详细信息。
- type:实体的类型名称,表示该实体所属的类型,例如 Customer、Order 等。
通过 __metadata 节点提供的元数据信息,客户端应用程序可以了解到每个实体的具体信息,包括实体的唯一标识符、类型、URI 地址等,方便客户端应用程序对数据进行处理和使用。
另外,__metadata 节点还可以包含实体的 ETAG
值,该值用于在客户端应用程序和服务端之间进行数据同步时,判断数据是否发生变化。客户端应用程序可以使用该值与服务端进行比对,避免数据冲突和重复更新。
以上解答了截图中黄色的 __metadata 部分,回到这位朋友的问题,真实场景下的 OData 还有另一部分较之 mockdata 多出来的 JSON 数据节点,即下图绿色的 d 和 results 节点。
在使用 ABAP 实现 SAP OData 服务时,返回的 JSON 数据中包含字段 d 和字段 results,这两个字段分别用于表示 OData 服务返回的数据。
字段 d 表示数据的根节点,它是一个 JSON 对象,包含以下两个属性:
- results:表示实体集合,它是一个 JSON 数组,包含 OData 服务返回的多个实体数据。
- __count:表示实体集合的数量,它是一个整数,表示实体集合中包含的实体数量。
通过字段 d 和其包含的 results 属性,客户端应用程序可以获取到 OData 服务返回的实体集合数据,进而进行数据处理和使用。
需要注意的是,如果 OData 服务返回的是单个实体数据而不是实体集合数据,则字段 d 可以省略,直接返回该实体数据。
换言之,results
是基于 ABAP 实现的 SAP OData 服务返回响应的一个标准字段:
在笔者这篇教程里也有详细介绍。
因此如果想自己的 SAP UI5 应用在 mock 数据和真实的 OData 响应之间无缝切换而不需要修改代码,只需要在 mock 数据里也增添上 d 和 results 字段,让其层级结构和 ABAP OData 服务响应完全一致即可。