热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

新建一个同名域能不能替换原域_SAPC/4HANASalesCloud使用OData服务和第三方系统集成的一个具体例子...

出于工作需要,Jerry写了这篇文章,给某些Partner做参考。以前Jerry曾经介绍过SAPC4HANA的五朵云到底包含哪些具体产品,

出于工作需要,Jerry写了这篇文章,给某些Partner做参考。

以前Jerry曾经介绍过SAP C/4HANA的五朵云到底包含哪些具体产品,其实在SAP官网上有更权威的中文解释:

https://www.sap.com/china/products/crm-commerce/c4-hana-cx-suite.html

464aaa32bcc5affac633cc40767ff0af.png

其中明确提到销售云包含SAP Cloud for Customer(C4C),SAP Revenue Cloud和Callidus Cloud。

d8cbb75c8bf73fc46465219bb2de2976.png

有Partner询问有没有更详细的步骤介绍,关于如何在第三方系统里调用SAP C4C暴露出的Restful API进行集成。本文就给出一个具体的例子,将SAP C4C销售订单的创建功能通过自定义的OData服务暴露出来,然后Partner可以根据项目需要选择合适的编程语言(本文选择Javascript)来消费。

Jerry以前发布过一个视频,演示了如何在SAP C4C里手动创建一个销售订单,步骤可以说简单易懂。

a0e060a9e966baa8017f729689fa1ecb.png

现在我们通过OData的方式将销售订单的创建功能暴露出来,就能在第三方系统或者应用里完成C4C的订单创建。

大家如果对SAP OData还不太了解,可以先读一读我这篇文章开头的部分:

SAP OData编程指南

下面是详细步骤。

登录C4C系统,访问工作中心Administrator,工作中心视图OData Service Explorer,这里可以在SAP发布的标准OData服务和客户自定义的OData服务之间切换。

8fce422efcb3f2065b8ae0249e80384e.png

因为客户自定义OData服务能够允许客户自行决定从哪一个Business Object的哪一些节点,选择哪一些字段来生成OData模型,通过这种灵活的方式可以避免Business Object上客户业务场景里不需要的字段出现在OData模型中。

点击New按钮新建一个OData服务:

0a614be383ff262ae460db1087e8c89e.png

给Work Center View字段指定一个用来做权限控制的视图,只有分配了这个视图的用户才有权限访问这个OData服务。

点击Select Business Object从弹出对话框中选择基于哪一个Business Object创建OData模型。

2a82cd76dd677d17b3b362fd123e9bc3.png

下图就是一个已经创建好并处于Active状态的OData服务。左边显示的是CustomerQuote这个BO的Root节点的所有字段,每个字段都有一个可以勾选或取消的Select属性,勾选则该BO字段会出现在右侧的OData模型里。

fc776b30d5da3f761402c5d9ae40e110.png

除了Root节点之外,BO的其他子节点上的字段当然也是可以出现在OData模型里的,比如我上图右边OData模型的子节点CustomerQuoteItem, CustomerQuoteParty和CustomerQuoteText等,就是分别从左边BO的同名节点选中后自动带到右边的OData模型中去的。

理论上,完成基于BO模型进行OData模型的创建并激活后,这个OData服务就可以使用了,这体现了SAP C4C OData服务自定义框架的强大之处。然而我也收到了一些朋友从后台给我提的一些问题,罗列如下。

问题1: 仍然以本文销售订单创建这一场景为例,假设我希望我创建的OData服务能够允许消费者调用时指定External Reference的值,但是我找遍整个BO列表,也没发现销售订单的BO上有叫这个名称的字段啊?

f00bf27a4fbd4246a0f11a5dc3843bc1.png

Jerry答:External Reference是UI文本,不是BO字段的技术名称。

给C4C系统在浏览器里的url添加参数debugMode=true, 然后刷新页面,按住Ctrl键再单击External Reference字段,

73bdceffa18dfb1557c4941c2c416a65.png

就能看到这个UI字段绑定到UI模型上哪一个字段了。

f104fe4f1c8ce7cb79fa07aba8f11671.png

在这个UI模型字段上再点击Show Model,就能看到这个UI模型字段绑定到的BO字段名称为BuyerID。

9d934868bd8125683a4503c19baf1a7e.png

所以我们在OData开发工具里,只需把BO字段BuyerID选中,移动到右边的OData模型里即可。

516809316ec1c5f1a1d875addb4455df.png

问题2:我想让我的OData服务支持行项目数据的创建,比如指定产品ID,描述和购买数量等等。我怎么知道哪些BO节点上的字段需要添加到OData模型中去?

edec5adb81ee64dbda41c0feb6077f26.png

Jerry答:现在我们换一种方法,打开Cloud Application Studio的UI Designer,定位到销售订单创建页面的UI模型COD_SALESORDER_QC, 找到Product ID字段,在它的Properties面板里即可看到这个Product ID字段绑定的BO字段的名称和完整路径:

Root-.ItemProposal-~ProductUUID-~content

7446e62c5c330139d4b43583dd3de2e8.png

因此我们需要将BO对应路径下面的ProductUUID字段添加到OData模型中去。这里能观察到ProductID的Create和Update是没有勾选上的,而ProductUUID则支持Create和Update,这个行为和C4C销售订单行项目创建的标准实现有关——消费者需要提供待创建行项目包含的产品UUID,然后C4C会根据UUID到系统中查询出对应的产品,显示其ID到UI上。如果消费者在调用OData服务时,没有指定ProductUUID,则行项目创建逻辑不会执行。

3f481bdfd57f0f4c4819f7b6c399b852.png

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:

a2a008efa82e9e7d2c4912b45db7ad14.png

发送这个HTTP GET请求,服务器端会生成一个CSRF token,通过HTTP响应结构头部字段x-csrf-token返回给消费者:

sNwnYC9cV4xeGSYZmJ8Dtw==

b7c20d8cff8cad178e583a25b7c1f34d.png

下面我们再在Postman里新建一个HTTP Post请求,将之前通过HTTP GET拿到的CSRF token,以HTTP Post请求头部字段的方式发送给C4C系统。

f5e31a26df72f63e6a548ecd815a8eee.png

关键在于HTTP Post请求的请求体。下图高亮部分是我在HTTP Post请求里指定的创建销售订单的输入数据:

000c8c7d80e061679955806807db0e5e.png

4a0af8fa655b7016a2ca6e3beedb8ce4.png

在Postman里发送这个Post请求,几秒钟后得到C4C的响应,订单创建成功,ID为9000000451:

7a17233da4324f5a95a03a0826dfcb2a.png

为了方便大家对比,下面是我用Postman消费我创建的OData服务生成的销售订单在系统里的显示。字段1~6对应的Postman输入字段可以在前文找到。

c5cc0fa570dff70593cb09c436571b50.png

蓝色区域高亮显示的字段,我在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和认证信息。

b2060e990a64ef493e59675022037cdf.png

Token拿到之后,将其放入第41行构造的HTTP Post请求的头部结构中,作为字段x-csrf-token的值。第47行发送该POST请求,C4C响应的数据存放于Javascript变量data中。

3ea91b1b431f54d1ce70fc4bf330d7cc.png

最后我通过简单的console.log打印出创建成功的销售订单ID:

659a8ae6879a59cc304eecb96339b94f.png

在命令行里用node执行这个js文件,会打印出从C4C获取到的CSRF token,以及成功创建的订单ID。

f5d964a4721fe7a5fae2ae8a9dc94138.png

我们再回顾一下用SAP C/4HANA Sales Cloud中的C4C OData同外部系统做集成的三个主要步骤:

1. 在C4C的OData模型编辑页面里,根据业务需要,从对应的BO节点里选择合适的字段,添加到OData模型中。

2. 用Postman或者C4C自带的OData测试工具对OData模型进行测试,确保其正常工作。

3. 根据项目需要选择合适的编程语言消费OData服务。

如果对于SAP C4C OData有更多的问题需要讨论,欢迎留言。感谢阅读。

Jerry关于OData的更多文章

1. SAP OData编程指南

2. OData服务同步模式和异步模式的讨论

https://blogs.sap.com/2015/06/19/a-test-on-fiori-odata-request-synchronous-mode-vs-asynchronous-mode/

3. OData服务的性能分析

https://blogs.sap.com/2015/07/01/how-to-find-odata-performance-trace-and-payload-trace-functionality/

https://blogs.sap.com/2016/01/13/measure-the-performance-of-your-odata-service/

4. 基于SAP CDS view生成OData服务

https://blogs.sap.com/2016/03/12/my-cds-view-self-study-tutorial-part-4-how-does-annotation-odatapublish-work/

5. OData的offline支持

5.1 https://blogs.sap.com/2016/08/04/how-is-odata-request-routed-to-offline-data-store-by-odata-offline-plugin/

5.2 https://blogs.sap.com/2016/08/04/how-is-Javascript-code-in-odata-offline-plugin-delegated-to-native-java-code-in-android/

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服务进行高并发性能测试

https://blogs.sap.com/2017/08/28/odata-service-parallele-performance-measurement-how-to-deal-with-xsrf-token-in-java-program-and-jmeter/

9. 使用C4C OData + ABSL消费自定义BO的逻辑

https://blogs.sap.com/2017/12/07/expose-custom-bo-logic-implemented-by-absl-via-custom-odata-service/




推荐阅读
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 2.2 组件间父子通信机制详解
    2.2 组件间父子通信机制详解 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • 本文深入解析了WCF Binding模型中的绑定元素,详细介绍了信道、信道管理器、信道监听器和信道工厂的概念与作用。从对象创建的角度来看,信道管理器负责信道的生成。具体而言,客户端的信道通过信道工厂进行实例化,而服务端则通过信道监听器来接收请求。文章还探讨了这些组件之间的交互机制及其在WCF通信中的重要性。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 深入解析CAS机制:全面替代传统锁的底层原理与应用
    本文深入探讨了CAS(Compare-and-Swap)机制,分析了其作为传统锁的替代方案在并发控制中的优势与原理。CAS通过原子操作确保数据的一致性,避免了传统锁带来的性能瓶颈和死锁问题。文章详细解析了CAS的工作机制,并结合实际应用场景,展示了其在高并发环境下的高效性和可靠性。 ... [详细]
  • 使用Maven JAR插件将单个或多个文件及其依赖项合并为一个可引用的JAR包
    本文介绍了如何利用Maven中的maven-assembly-plugin插件将单个或多个Java文件及其依赖项打包成一个可引用的JAR文件。首先,需要创建一个新的Maven项目,并将待打包的Java文件复制到该项目中。通过配置maven-assembly-plugin,可以实现将所有文件及其依赖项合并为一个独立的JAR包,方便在其他项目中引用和使用。此外,该方法还支持自定义装配描述符,以满足不同场景下的需求。 ... [详细]
  • 本文将继续探讨 JavaScript 函数式编程的高级技巧及其实际应用。通过一个具体的寻路算法示例,我们将深入分析如何利用函数式编程的思想解决复杂问题。示例中,节点之间的连线代表路径,连线上的数字表示两点间的距离。我们将详细讲解如何通过递归和高阶函数等技术实现高效的寻路算法。 ... [详细]
  • 在多年使用Java 8进行新应用开发和现有应用迁移的过程中,我总结了一些非常实用的技术技巧。虽然我不赞同“最佳实践”这一术语,因为它可能暗示了通用的解决方案,但这些技巧在实际项目中确实能够显著提升开发效率和代码质量。本文将深入解析并探讨这四大高级技巧的具体应用,帮助开发者更好地利用Java 8的强大功能。 ... [详细]
  • CentOS 7环境下Jenkins的安装与前后端应用部署详解
    CentOS 7环境下Jenkins的安装与前后端应用部署详解 ... [详细]
  • 半导体IP作为芯片设计的关键组成部分,是集成电路开发中的核心要素之一。这种经过验证、可重复使用的模块具备特定功能,通常由第三方供应商提供,能够显著提升设计效率和可靠性,降低开发成本和周期。在现代集成电路设计中,半导体IP的合理选择与应用对项目的成功至关重要。 ... [详细]
  • 在Kubernetes上部署多个Mitmproxy代理服务器以实现高效流量管理 ... [详细]
author-avatar
supe丶r女人帮
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有