ABAP OData服务创建实体POST请求遇CSRF令牌验证失败问题
ABAP OData POST请求CSRF令牌验证失败问题
我因工作需求学习ABAP OData服务,在实现创建实体的POST请求时遇到了CSRF令牌验证失败的问题。
我的实现代码
METHOD airportsset_create_entity. **************************************************** * VARIABLES **************************************************** DATA: lt_wa_input_data LIKE er_entity, lt_wa_airport TYPE zt_xy_airport, lv_max_id TYPE zd_xy_id. **************************************************** * METHOD LOGIC **************************************************** " Get the data from the post request body. CALL METHOD io_data_provider->read_entry_data IMPORTING es_data = lt_wa_airport. " Copy data into the work area. MOVE-CORRESPONDING lt_wa_input_data TO lt_wa_airport. " Select the max id from the table to prevent duplicate key error. SELECT SINGLE MAX( airport_id ) FROM zt_xy_airport INTO lv_max_id. " Fill out the remaining fields of the work area. lt_wa_airport-mandt = sy-mandt. lt_wa_airport-airport_id = lv_max_id + 1. " Insert the data to the table. INSERT zt_kd_airport FROM lt_wa_airport. ENDMETHOD.
遇到的错误
CSRF token validation failed
我尝试过从GET请求头获取令牌并加入POST请求头,但问题依然存在,当前使用SAP LOGON 770。
问题排查与解决步骤
1. 确认CSRF令牌的获取与传递逻辑
- 必须在同一会话内先发起GET请求(比如获取服务元数据或实体集),从响应头的
x-csrf-token字段提取令牌 - POST请求时,请求头必须同时携带:
x-csrf-token: [获取到的令牌值]- 对应会话的
Cookie(从GET响应头中复制)
会话Cookie和令牌是绑定的,跨会话使用令牌必然验证失败
2. 检查OData服务的CSRF配置
- 用事务码
/IWFND/MAINT_SERVICE找到你的服务,确认CSRF Protection处于开启状态(这是默认安全配置,若手动关闭过需重新开启并激活服务)
3. 修正代码中的错误
你的CREATE_ENTITY方法存在两处明显问题,可能引发请求异常:
- 数据读取逻辑顺序错误:先把请求数据读到
lt_wa_airport,之后用未赋值的lt_wa_input_data覆盖了它,应该调整为:" 先初始化工作区,再读取请求数据 MOVE-CORRESPONDING er_entity TO lt_wa_input_data. CALL METHOD io_data_provider->read_entry_data IMPORTING es_data = lt_wa_input_data. MOVE-CORRESPONDING lt_wa_input_data TO lt_wa_airport. - 表名不一致:查询最大ID用的是
zt_xy_airport,插入时却用zt_kd_airport,需统一为同一个表名
4. SAP LOGON 770测试工具的正确用法
如果用/IWFND/GW_CLIENT测试:
- 先发送GET请求,勾选Fetch CSRF Token选项,系统会自动获取令牌
- 切换到POST请求时,系统会自动填充CSRF令牌和会话Cookie,无需手动添加
- 确保请求体格式(JSON/XML)与服务预期一致
内容的提问来源于stack exchange,提问作者dave25
相关产品推荐
相关产品推荐

