如何使用|如何使用 ABAP 代码消费需要传递 CSRF token 的 OData 服务试读版

正如本教程的开篇介绍文章SAP OData 开发教程 - 从入门到提高(包含 SEGW, RAP 和 CDP)所提到的,SAP OData 服务开发,从实现技术上来说,可以分为三大类。因此本教程也分为三大部分,分别进行介绍。本文是本教程的文章目录。
作者简介
Jerry Wang,2007 年从电子科技大学计算机专业硕士毕业后加入 SAP 成都研究院工作至今。Jerry 是 SAP 社区导师,SAP 中国技术大使。在长达 15 年的 SAP 标准产品开发生涯里,Jerry 曾经先后参与 SAP Business ByDesign, SAP CRM, SAP Cloud for Customer, SAP S/4HANA, SAP Commerce Cloud(电商云)等标准产品的研发工作。
【如何使用|如何使用 ABAP 代码消费需要传递 CSRF token 的 OData 服务试读版】Jerry 对 SAP OData 服务的开发,测试,发布,部署,测试,及基于各种不同 SAP 技术实现的 OData 服务的幕后技术实现细节和使用场合,均有着深入的研究。
如何使用|如何使用 ABAP 代码消费需要传递 CSRF token 的 OData 服务试读版
文章图片

基于 SEGW - Gateway Service Builder 的开发教程

  • 1. 在 SAP ABAP 事物码 SEGW 里创建 SAP OData 项目
  • 2. 在 SAP ABAP 系统对事物码 SEGW 创建的 OData 服务进行配置并测试
  • 3. SAP ABAP OData 服务诊断工具 /IWFND/ERROR_LOG 的使用方法
  • 4. SAP ABAP OData 服务 Data Provider Class 的 GET_ENTITYSET 方法实现指南
  • 5. SAP ABAP OData 服务如何支持 $filter (过滤)操作
  • 6. 使用 Postman 工具高效管理和测试 SAP ABAP OData 服务
  • 7. SAP ABAP OData 服务如何支持 $orderby (排序)操作
  • 8. SAP ABAP OData 服务如何支持创建(Create)操作
  • 9. SAP ABAP OData 服务如何支持删除(Delete)操作
  • 10. SAP ABAP OData 服务如何支持修改(Update)操作
  • 11. 使用 HTTP PUT, PATCH 以及 MERGE 请求消费 SAP ABAP OData 服务修改操作的实现及其区别
  • 12. SAP ABAP OData 服务如何支持 $select 有选择性地仅读取部分模型字段值
  • 13. SAP ABAP OData 服务的分页加载数据集的实现(Paging)
  • 14. 几种 SAP ABAP OData 服务的性能评估和测试工具介绍
  • 15. SAP ABAP OData 服务里 EntityType 和 EntitySet 的区别
  • 16. 如何修改 SAP ABAP OData 模型,使其支持 $expand 操作
  • 17. 如何通过 SAP ABAP OData $expand 操作在同一个 HTTP 请求中返回多个节点的数据
  • 18. SAP ABAP OData 服务嵌套创建功能的实现步骤(Create Deep)
  • 19. 如何使用 ABAP 程序消费 SAP ABAP OData 服务
  • 20. 如何使用 ABAP 代码消费需要传递 CSRF token 的 OData 服务
  • 更多文章正在写作中,敬请期待
使用 Restful ABAP Programming 编程模型(简称 RAP) 开发 OData 服务
  • 正在写作中,敬请期待
使用 SAP Cloud Application Programming 编程模型开发 OData 服务
  • 正在写作中,敬请期待
本教程的前一步骤,我们使用 ABAP 代码,消费了我们自己开发的 OData 服务。
访问的 url 如下:
https://{{host}}:{{port}}/sap/opu/odata/sap/ZBOOK_MANAGE_SRV/BookSet(guid'42010aee-2a94-1edd-8494-c9d14e91555e')
这个 url 因为是简单的 HTTP GET 进行的读取操作,所以消费的时候,不需要在 HTTP 请求的头部字段里,传递 CSRF token 值。
本步骤我们继续学习一个复杂一点的场景,我们期望用 ABAP 代码触发一个 OData 服务的修改操作,使用的 HTTP 请求类型为 PUT. 因为涉及到业务数据的修改操作,所以 OData 服务协议规定,在提交这个修改操作时,HTTP 请求的头部字段,需要包含一个名叫 x-csrf-token 的字段,值为从 ABAP 服务器请求的 CSRF token 值。
如何使用|如何使用 ABAP 代码消费需要传递 CSRF token 的 OData 服务试读版
文章图片

关于这个数据修改的更多操作,参考本教程之前的步骤:
  • 10. SAP ABAP OData 服务如何支持修改(Update)操作
  • 11. 使用 HTTP PUT, PATCH 以及 MERGE 请求消费 SAP ABAP OData 服务修改操作的实现及其区别
简单地说,我们在 ABAP 代码里,需要实现的步骤,和我们在 Postman 里的操作完全一致。
首先使用 ABAP 代码,获取 CSRF token.
完整代码参考这篇文章。
请求 CSRF token 的代码,同前一步骤通过 ABAP 代码调用 OData 服务的读取操作相比,一个区别就是,我们需要在 HTTP 请求的头部字段里,增加一个名叫 x-csrf-token 的字段,值为 fetch.
如何使用|如何使用 ABAP 代码消费需要传递 CSRF token 的 OData 服务试读版
文章图片

这样,我们可以利用 get_header_field 方法,从 HTTP 响应头部字段里,获取名叫 x-csrf-token 字段的值,也就是服务器返回的 CSRF token,如下图调试器里所示。
紧接着进入程序的第二部分,新建第二个 if_http_client 实例,调用该实例向服务器发送第二个 HTTP PUT 请求,同时使用刚刚从服务器端获得的 CSRF token,作为 HTTP 头部字段 x-csrf-token 的值。
第二部分的代码如下。
两部分编写完毕,执行报表,在最后一行,从服务器得到的响应,居然是 CSRF token validation failed
如何使用|如何使用 ABAP 代码消费需要传递 CSRF token 的 OData 服务试读版
文章图片

这就让人很费解了,为什么我们将第一个 HTTP 请求,从服务器获取的 CSRF token,立即传递给了 第二个 HTTP 请求的头部字段,为什么仍然遇到 CSRF token 验证失败的错误消息呢?
问题分析及解决方案在这里。

    推荐阅读