ABAP使用CL_HTTP_CLIENT发JSON POST返回400且服务端收空负载问题排查
问题排查方案
- 核心原因:ABAP 大体积Payload默认启用分块传输,目标服务端不支持
小体积JSON发送正常、大体积JSON服务端接收为空是典型的分块传输兼容问题:ABAP的cl_http_client在Payload超过约8KB时会默认使用Transfer-Encoding: chunked分块编码,若目标服务端未适配该编码规范就会识别不到请求体。Postman发送时默认自动计算Content-Length、不会启用分块传输,所以请求正常。
修复方案:在设置请求体后手动添加Content-Length头,关闭分块传输:" 放在set_cdata调用之后,send调用之前 DATA(lv_json_xstr) = cl_abap_codepage=>convert_to( source = jsondata ). DATA(lv_content_len) = xstrlen( lv_json_xstr ). client->request->set_header_field( EXPORTING name = 'Content-Length' value = CONV string( lv_content_len ) ). " 显式清空分块传输标识,强制走普通传输模式 client->request->set_header_field( EXPORTING name = 'Transfer-Encoding' value = '' ). - 次要问题:请求方法设置顺序建议调整
你当前是先设置请求体再设置POST方法,虽然大多数场景下无影响,但规范顺序应该是先设置请求方法,再配置头和请求体,避免部分内核版本出现异常:" 调整顺序,放在所有请求配置的最前面 client->request->set_method( if_http_request=>co_request_method_post ). - 额外逻辑错误提示
你代码中响应判断的逻辑存在语法错误,判断永远为真:" 原错误逻辑:用OR连接不等于判断,任何状态码都满足条件 If zhcm_fdexperience=>codigo Ne '200' Or zhcm_fdexperience=>codigo Ne '000' Or zhcm_fdexperience=>codigo Ne '0'. " 修正为用AND连接 If zhcm_fdexperience=>codigo Ne '200' AND zhcm_fdexperience=>codigo Ne '000' AND zhcm_fdexperience=>codigo Ne '0'. - 本地调试验证方法
可以通过SAP自带的SMICM工具抓包确认请求发送内容:- 事务码SMICM进入ICM管理界面
- 点击
转到 -> 跟踪 -> 激活,选择HTTP跟踪级别为3 - 复现请求后点击
转到 -> 跟踪 -> 显示缓冲区,即可查看完整的发送请求报文,确认Payload是否正常带出
内容的提问来源于stack exchange,提问作者Ivan Diaz Salas
相关产品推荐
相关产品推荐

