调用 SAP WebService 时,常见的一个经典错误是:Transport error : 401 Error:Unauthorized,中文直译为“授权失败”。对于 SAP 这类企业级系统而言,此问题通常并非单纯的密码输入错误,而是认证机制未能正确匹配。
问题的根源在于:SAP WebService 默认启用了 WS-Security 认证,当客户端发起调用时,若未显式提供用户名和密码,服务端便会直接返回 401 错误。换句话说,问题不在于网络连通性,而在于身份认证信息未传递。
解决方案非常直接:在 SOAP 请求的传输层嵌入认证信息。具体实现是通过 HttpTransportProperties.Authenticator 设置用户名和密码,并将其绑定到服务客户端的配置选项中。参考下面这段代码:
// SAP 需要 ws-security 的认证,调用 SAP WebService 时必须带上用户名和密码:
HttpTransportProperties.Authenticator sapAuth = new HttpTransportProperties.Authenticator();
sapAuth.setUsername("hh_niuc");
sapAuth.setPassword("654321");
ServiceStub stubClient = getSyncStub(); // 注意:这个 client 是你自己的 ServiceStub,需要替换成真实对象
stubClient._getServiceClient().getOptions().setProperty(HTTPConstants.AUTHENTICATE, sapAuth);
核心步骤只有两步:先创建 Authenticator 对象并填入凭据,再通过 HTTPConstants.AUTHENTICATE 属性将其注入到服务调用上下文中。这样一来,每次请求都会自动携带认证信息,401 错误随即消失。
当然,在实际开发中,密码不应硬编码在代码里,而应从配置文件或密钥管理服务中读取——但原理相同。遇到类似 SAP WebService 认证错误时,优先检查认证处理器是否被正确注册,这是 SAP 集成场景中的标准操作。
