166、OData服务消费与扩展
那台测试机上的OData服务昨天还能正常调,今天早上一刷新,POST直接甩我一脸401。登录状态没问题,HTTP Basic也带了,$metadata能打开,偏偏业务方法进不去。最诡异的是,同样的账号在另一套系统上完全正常。当时我盯着SAP Gateway的错误日志,心里只有一个念头:这玩意到底是在哪儿拦住我的?
后来查到是CSRF token的问题——不是没取,是取token的请求被缓存了。浏览器端有缓存还好说,ABAP端我用cl_http_client傻乎乎地复用了同一个连接,第二次调用直接拿了旧的token。SAP Gateway的/sap/opu/odata/sap/路径对CSRF校验特别严格,token过期或缺失就给你401,但不会告诉你“token过期”,只告诉你“Unauthorized”。这个坑,新手基本都会踩一次。
先别急着写代码,OData消费这件事,本质上是HTTP协议的事。你在ABAP里消费OData,不是用什么神秘“OData引擎”,就是拼URL、发请求、解析响应。SAP NetWeaver提供的/sap/opu/odata这个前缀告诉你,这是SAP Gateway框架的标准入口,后面跟服务名、实体集、key、导航属性。搞清楚这个URL结构,比背API重要一百倍。
看一个最简单的GET请求怎么拼。服务名ZMY_SRV,实体集ProductSet,要取单个产品,key是ProductGuid,值是个GUID。URL就是: