168、Gateway与服务生成,一次401把我逼疯了
那天晚上十一点,我盯着SAP Gateway的错误日志,心里只有一个念头:这破服务到底是谁生成的?问题出在一个简单的OData服务上,前端调/sap/opu/odata/sap/ZTEST_SRV,死活返回401。用户名密码没错,后端RFC用户也配了,SICF节点也激活了,可就是过不去。后来我打开/IWFND/ERROR_LOG,看到一条不起眼的提示:No authorization for ICF node /sap/bc/rest。那一刻我才反应过来,问题不在业务逻辑,而是Gateway框架本身在访问后端时,把请求转发给了一个“没有生成好”的Runtime服务。
ABAP Gateway不是个玄学,它就是一个翻译官。前端拿OData协议来敲门,Gateway把门打开,翻译成RFC或者HTTP调用,去后端取数,再翻译回OData格式。但这个翻译官不是天生就会所有语言,你必须告诉它“哪个实体集对应哪个RFC函数”、“哪个导航路径对应哪张表”。这些定义,就是服务生成的内容。很多人以为用SEGW建个项目、激活一下、注册个服务就完事了,其实那只是第一步。真正跑起来的时候,服务生成的质量,决定了你调试时是喝咖啡还是砸键盘。
先说最坑的地方:服务生成的三种方式,别搞混。第一种是“封装RFC”,你在SEGW里导入一个RFC函数,系统自动生成实体集和操作。第二种是“直接读表”,SEGW里定义实体类型,映射到数据库表,生成只读服务。第三种是“自定义模型”,完全手写/IWCOR/ODATA相关的类,所有逻辑自己扛。很多人一