SOAP转HTTP场景下HTTP_AAE向ABAP服务器传递HTTP错误载荷方案咨询
解决方案:SAP PO/PI中HTTP错误载荷回传至ABAP系统
1. HTTP_AAE适配器的标准配置选项
首先优先尝试标准配置,无需开发即可实现需求:
- 打开HTTP_AAE接收适配器的配置界面,切换到错误处理标签页
- 勾选将HTTP 4xx/5xx状态码视为成功响应(不同PO版本措辞可能略有差异,部分版本叫“不为HTTP错误抛出异常”)
- 确认响应处理设置为将响应返回给发送方(同步场景下默认启用,但需检查是否被修改)
该配置会让适配器把错误状态码对应的响应体当作正常响应返回给SOAP发送端,而非触发PO内消息失败。ABAP端只需在SOAP调用逻辑中解析响应体,同时可通过SOAP头或消息属性获取HTTP状态码,区分正常/错误场景。
2. 扩展/重写HttpAdapterBean的实现方式
若标准配置无法满足更复杂的错误处理逻辑(比如需要自定义错误响应格式),可通过自定义模块扩展或替换标准HttpAdapterBean:
核心思路
绕过标准模块的异常终止逻辑,自行处理HTTP调用与错误响应:
- 实现SAP PO的
Module接口,手动执行HTTP请求并捕获所有响应 - 无论状态码是否为错误,均将响应体封装为正常消息返回至发送端
- 可选:将HTTP状态码存入消息属性,供ABAP端判断
示例代码片段
import com.sap.aii.af.lib.mp.module.*; import com.sap.engine.interfaces.messaging.api.*; import org.apache.http.*; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; public class CustomHttpErrorHandler implements Module { @Override public ModuleData process(ModuleContext ctx, ModuleData input) throws ModuleException { try { // 读取输入消息载荷与适配器配置参数 Message msg = (Message) input.getPrincipalData(); String requestPayload = msg.getBody(String.class); String targetUrl = ctx.getContextData("TargetUrl"); // 执行HTTP请求 try (CloseableHttpClient client = HttpClients.createDefault()) { HttpPost post = new HttpPost(targetUrl); post.setEntity(new StringEntity(requestPayload, "UTF-8")); post.setHeader("Content-Type", "application/json"); HttpResponse response = client.execute(post); int statusCode = response.getStatusLine().getStatusCode(); String responseBody = EntityUtils.toString(response.getEntity(), "UTF-8"); // 将错误响应体设为消息主载荷 msg.setBody(responseBody); // 将状态码存入消息属性,供ABAP端读取 msg.getMessageProperties().setProperty("HTTP_STATUS_CODE", String.valueOf(statusCode)); input.setPrincipalData(msg); return input; } } catch (Exception e) { throw new ModuleException("HTTP请求处理失败: " + e.getMessage(), e); } } }
部署与配置
- 将代码打包为符合SAP PO规范的EJB模块,部署至PO服务器
- 在HTTP_AAE适配器的模块链中,移除标准的
HttpAdapterBean,添加自定义模块 - 配置模块参数(如
TargetUrl),与原适配器的目标URL保持一致
3. 是否需要编写自定义适配器?
不需要。自定义适配器开发成本高、维护难度大,且SAP PO提供的模块扩展机制完全能覆盖此类需求。仅当标准模块与扩展方式均无法满足极端定制化场景(比如特殊协议适配)时,才考虑开发自定义适配器。
最佳实践
- 优先使用标准配置,减少自定义代码的维护成本
- ABAP端需同步调整SOAP调用逻辑:通过读取消息属性中的HTTP状态码,区分正常响应与错误响应,解析对应的载荷内容
- 在PO端保留错误日志:即使将错误响应回传ABAP,也要在PO消息监控中记录完整的请求/响应详情,便于后续调试
内容的提问来源于stack exchange,提问作者syedijlalayub
相关产品推荐
相关产品推荐

