SAP C/4HANA Sales Cloud使用OData服务和第三方系统集成的一个具体例子
出于工作需要,Jerry写了这篇文章,给某些Partner做参考。
以前Jerry曾经介绍过SAP C/4HANA的五朵云到底包含哪些具体产品,其实在SAP官网上有更权威的中文解释:
https://www.sap.com/china/products/crm-commerce/c4-hana-cx-suite.html
其中明确提到销售云包含SAP Cloud for Customer(C4C),SAP Revenue Cloud和Callidus Cloud。
有Partner询问有没有更详细的步骤介绍,关于如何在第三方系统里调用SAP C4C暴露出的Restful API进行集成。本文就给出一个具体的例子,将SAP C4C销售订单的创建功能通过自定义的OData服务暴露出来,然后Partner可以根据项目需要选择合适的编程语言(本文选择JavaScript)来消费。
Jerry以前发布过一个视频,演示了如何在SAP C4C里手动创建一个销售订单,步骤可以说简单易懂。
https://v.qq.com/x/page/d0809f4tswl.html
现在我们通过OData的方式将销售订单的创建功能暴露出来,就能在第三方系统或者应用里完成C4C的订单创建。
大家如果对SAP OData还不太了解,可以先读一读我这篇文章开头的部分:
下面是详细步骤。
登录C4C系统,访问工作中心Administrator,工作中心视图OData Service Explorer,这里可以在SAP发布的标准OData服务和客户自定义的OData服务之间切换。
因为客户自定义OData服务能够允许客户自行决定从哪一个Business Object的哪一些节点,选择哪一些字段来生成OData模型,通过这种灵活的方式可以避免Business Object上客户业务场景里不需要的字段出现在OData模型中。
点击New按钮新建一个OData服务:
给Work Center View字段指定一个用来做权限控制的视图,只有分配了这个视图的用户才有权限访问这个OData服务。
点击Select Business Object从弹出对话框中选择基于哪一个Business Object创建OData模型。
下图就是一个已经创建好并处于Active状态的OData服务。左边显示的是CustomerQuote这个BO的Root节点的所有字段,每个字段都有一个可以勾选或取消的Select属性,勾选则该BO字段会出现在右侧的OData模型里。
除了Root节点之外,BO的其他子节点上的字段当然也是可以出现在OData模型里的,比如我上图右边OData模型的子节点CustomerQuoteItem, CustomerQuoteParty和CustomerQuoteText等,就是分别从左边BO的同名节点选中后自动带到右边的OData模型中去的。
理论上,完成基于BO模型进行OData模型的创建并激活后,这个OData服务就可以使用了,这体现了SAP C4C OData服务自定义框架的强大之处。然而我也收到了一些朋友从后台给我提的一些问题,罗列如下。
问题1: 仍然以本文销售订单创建这一场景为例,假设我希望我创建的OData服务能够允许消费者调用时指定External Reference的值,但是我找遍整个BO列表,也没发现销售订单的BO上有叫这个名称的字段啊?
Jerry答:External Reference是UI文本,不是BO字段的技术名称。
给C4C系统在浏览器里的url添加参数debugMode=true, 然后刷新页面,按住Ctrl键再单击External Reference字段,
就能看到这个UI字段绑定到UI模型上哪一个字段了。
在这个UI模型字段上再点击Show Model,就能看到这个UI模型字段绑定到的BO字段名称为BuyerID。
所以我们在OData开发工具里,只需把BO字段BuyerID选中,移动到右边的OData模型里即可。
问题2:我想让我的OData服务支持行项目数据的创建,比如指定产品ID,描述和购买数量等等。我怎么知道哪些BO节点上的字段需要添加到OData模型中去?
Jerry答:现在我们换一种方法,打开Cloud Application Studio的UI Designer,定位到销售订单创建页面的UI模型COD_SALESORDER_QC, 找到Product ID字段,在它的Properties面板里即可看到这个Product ID字段绑定的BO字段的名称和完整路径:
Root-.ItemProposal-~ProductUUID-~content
因此我们需要将BO对应路径下面的ProductUUID字段添加到OData模型中去。这里能观察到ProductID的Create和Update是没有勾选上的,而ProductUUID则支持Create和Update,这个行为和C4C销售订单行项目创建的标准实现有关——消费者需要提供待创建行项目包含的产品UUID,然后C4C会根据UUID到系统中查询出对应的产品,显示其ID到UI上。如果消费者在调用OData服务时,没有指定ProductUUID,则行项目创建逻辑不会执行。
OData模型创建好之后,在用编程语言消费之前,我们可以先用工具Postman(或者C4C自带的测试工具)进行测试。
因为SAP C4C后台对Cross-site request forgery(跨站请求伪造)这种攻击采取的防御实现和SAP CRM,SAP S/4HANA一样,采取的是CSRF token验证机制,因此我们在调用OData服务进行销售订单创建时,需要将一个合法的CSRF token一并传递给C4C系统。
如何得到一个合法的CSRF token呢?在Postman里构造一个HTTP GET请求,头部字段名为
x-csrf-token, 值为fetch:
发送这个HTTP GET请求,服务器端会生成一个CSRF token,通过HTTP响应结构头部字段x-csrf-token返回给消费者:
sNwnYC9cV4xeGSYZmJ8Dtw==
下面我们再在Postman里新建一个HTTP Post请求,将之前通过HTTP GET拿到的CSRF token,以HTTP Post请求头部字段的方式发送给C4C系统。
关键在于HTTP Post请求的请求体。下图高亮部分是我在HTTP Post请求里指定的创建销售订单的输入数据:
在Postman里发送这个Post请求,几秒钟后得到C4C的响应,订单创建成功,ID为9000000451:
为了方便大家对比,下面是我用Postman消费我创建的OData服务生成的销售订单在系统里的显示。字段1~6对应的Postman输入字段可以在前文找到。
蓝色区域高亮显示的字段,我在Postman里构造的输入里并没有维护,而是通过SAP C4C系统的各种determination配置,自动决定出来的。最典型的有SAP老司机们天天打交道的Partner determination,Organization determination,Pricing determination等。
Postman里测试通过后,就可以写代码消费了。
如果想直接复制粘贴我下面列出的代码,可以从我的github上获得:
https://github.com/i042416/KnowlegeRepository/blob/master/ABAP/C4COData/create_SalesOrder.js
注意本代码只用于演示目的,缺少健壮的出错处理,不能直接用于生产环境中。
下面的代码使用nodejs提供的request模块向C4C请求CSRF token。注意第3行的url和第11行的Authorization头部的值,我都是用的虚假值,请大家替换成自己实际使用的C4C url和认证信息。
Token拿到之后,将其放入第41行构造的HTTP Post请求的头部结构中,作为字段x-csrf-token的值。第47行发送该POST请求,C4C响应的数据存放于JavaScript变量data中。
最后我通过简单的console.log打印出创建成功的销售订单ID:
在命令行里用node执行这个js文件,会打印出从C4C获取到的CSRF token,以及成功创建的订单ID。
我们再回顾一下用SAP C/4HANA Sales Cloud中的C4C OData同外部系统做集成的三个主要步骤:
1. 在C4C的OData模型编辑页面里,根据业务需要,从对应的BO节点里选择合适的字段,添加到OData模型中。
2. 用Postman或者C4C自带的OData测试工具对OData模型进行测试,确保其正常工作。
3. 根据项目需要选择合适的编程语言消费OData服务。
如果对于SAP C4C OData有更多的问题需要讨论,欢迎留言。感谢阅读。
Jerry关于OData的更多文章
2. OData服务同步模式和异步模式的讨论
3. OData服务的性能分析
https://blogs.sap.com/2016/01/13/measure-the-performance-of-your-odata-service/
4. 基于SAP CDS view生成OData服务
5. OData的offline支持
5.3 https://blogs.sap.com/2016/08/05/how-is-odata-offline-store-opened-in-android-platform/
6. 使用ABAP消费SAP C4C标准OData服务
https://blogs.sap.com/2017/08/04/consume-standard-c4c-odata-service-via-abap-code/
7. SAP CRM,C4C和S/4HANA里OData服务实现的横向比较
https://blogs.sap.com/2017/08/07/odata-service-backend-implementation-in-c4c-crm-and-s4-hana/
8. 使用Java和jMeter对需要支持CSRF验证的OData服务进行高并发性能测试
9. 使用C4C OData + ABSL消费自定义BO的逻辑
要获取更多Jerry的原创文章,请关注公众号"汪子熙":
SAP C/4HANA Sales Cloud使用OData服务和第三方系统集成的一个具体例子的更多相关文章
- SAP C/4HANA与人工智能和增强现实(AR)技术结合的又一个创新案例
今天这篇迟到的文章,来自我的同事Aviva. 去年SAP C/4HANA发布之后,SAP的从业者们可能或多或少都读过一些来自SAP官方渠道,比如微信公众号"SAP天天事"发布的一些 ...
- UI5-学习篇-5-SAP创建OData服务-Structure
本文介绍SAP后端系统基于数据结构创建OData服务过程. 1.创建数据字典 2.创建OData service 2.1创建Gateway service project 事务码:SEGW 点击Cre ...
- SAP人工智能服务Recast.AI的一个简单例子
关于这个例子的完整介绍,请参考公众号 "汪子熙"的两篇文章: SAP C/4HANA与人工智能和增强现实(AR)技术结合的又一个创新案例 和使用Recast.AI创建具有人工智能的 ...
- 在SAP云平台的CloudFoundry环境下消费ABAP On-Premise OData服务
我的前一篇文章 使用Java+SAP云平台+SAP Cloud Connector调用ABAP On-Premise系统里的函数介绍了在SAP云平台的Neo环境下如何通过SAP Cloud Conne ...
- 使用SAP Cloud Application Programming模型开发OData的一个实际例子
刚刚过去的SAP TechEd上,SAP CTO Juergen Mueller向外界传递了一个重要的信息:身处云时代大环境下的SAP从业者,在SAP云平台上该如何选择适合自己的开发方式? Juerg ...
- 如何在SAP云平台的Cloud Foundry环境下添加新的Service(服务)
我想在SAP云平台的Cloud Foundry环境下使用MongoDB的服务,但是我在Service Marketplace上找不到这个服务. cf marketplace返回的结果也没有. 解决方案 ...
- 如何在SAP gateway系统配置路由到后台系统的OData服务路径
看这张架构图,SAP Gateway系统也叫frontend系统,通过RFC远程调用SAP后台系统的OData服务实现. 以SAP CRM Fiori应用My Opportunity为例,使用事务码/ ...
- 如何自行给指定的SAP OData服务添加自定义日志记录功能
有的时候,SAP标准的OData实现或者相关的工具没有提供我们想记录的日志功能,此时可以利用SAP系统强大的扩展特性,进行自定义日志功能的二次开发. 以SAP CRM Fiori应用"My ...
- 如何使用API的方式消费SAP Commerce Cloud的订单服务
最近Jerry在做一个微信和SAP Commerce Cloud集成的项目,需要在微信里调用后者的Restful API进行订单创建和读取.以前Jerry对SAP Commerce Cloud知之甚少 ...
随机推荐
- sqlite3使用
sqlite3使用 sqlite可以在https://www.sqlite.org/网站上下载.支持Linux, MacOS, Windows等各种操作系统.下载后不需要安装,解压后就可以使用,追加路 ...
- 快速上手:在CVM上安装Apache
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由一步 发表于云+社区专栏 介绍 Apache HTTP服务器是世界上使用最广泛的Web服务器.它提供了许多强大的功能,包括可动态加载的 ...
- Java ConcurrentModificationException异常原因和解决方法(转)
摘自:http://www.cnblogs.com/dolphin0520/p/3933551.html#undefined 在前面一篇文章中提到,对Vector.ArrayList在迭代的时候如果同 ...
- 微信小程序准备阶段。(一)
--知识储备--HTML+JS+CSS (一)下载一个微信web开发工具(后续代码都会写在这里边)附上链接:https://mp.weixin.qq.com/debug/wxadoc/dev/devt ...
- JVM(二) 对象存活判断和垃圾回收算法
对象的创建 概述 下面简要介绍创建对象的几个重要步骤 : 检查能否在常量池定位到一个类的符号引用,并检查这个符号代表的类是否已被加载,解析和初始化过.如果没有则执行类加载的操作.(即是说对象的引用放在 ...
- spring实现固定时间定时器
此文章是基于 搭建Jquery+SpringMVC+Spring+Hibernate+MySQL平台 一. jar包介绍 1. spring-framework-4.3.4.RELEASE 的 lib ...
- HDU4652:Dice
题面 传送门 题意 \(m\)面的骰子 求连续出现\(n\)个相同面的期望次数 或者 求连续出现\(n\)个不同面的期望次数 Sol 设\(f[i]\)表示已经出现了\(i\)~\(n\)这些面相同的 ...
- iis添加共享目录为虚拟目录
注意物理路径处不能直接选择映射成的本地盘符!!!
- 移动端h5开发相关内容总结css篇--笔记
原文参考http://mp.weixin.qq.com/s/Nho2DHj-Y59j2F62vpN9jQ 1.开发移动端,头部必要的配置<meta name="viewport&quo ...
- Windows API 编程----将错误代码转换成错误描述信息
Windows编程有时会因为调用函数而产生错误,调用GetLastError()函数可以得到错误代码.如果错误代码为0,说明没有错误:如果错误代码不为0,则说明存在错误. 而错误代码不方便编程人员或用 ...