Java基于WSDL生成的SOAP客户端如何在请求头添加API密钥
Apache Axis 调用SOAP服务添加API密钥请求头解决方案
报错原因
该报错是因为服务端要求SOAP请求必须在Header中携带合法的API密钥校验信息,当前代码未附加对应头参数,因此被服务端拦截返回错误。
实现步骤
你使用的是Apache Axis 1.x版本的客户端,可通过SoapBindingStub自带的setHeader方法注入自定义请求头,调整后代码如下:
1. 先导入依赖类
import org.apache.axis.message.SOAPHeaderElement; import javax.xml.namespace.QName; import java.net.URL;
2. 调整业务调用代码
ServiceImplSynchronization service = new ServiceSynchronizationLocator(); ServiceSynchronization ws = new ServiceSynchronizationSoapBindingStub(new URL(service.getServiceFacturacionSynchronizationPortAddress()), service); // 以下为新增API密钥头逻辑 // 替换为WSDL中定义的targetNamespace实际值 String serviceNamespace = "http://你的服务实际命名空间地址/"; // 替换为接口要求的API密钥头字段名,若服务要求用Authorization则改为此值 String apiHeaderName = "ApiKey"; // 替换为你申请到的实际API密钥值 String apiToken = "你的实际API_KEY"; // 构造SOAP头对象 SOAPHeaderElement apiKeyHeader = new SOAPHeaderElement(new QName(serviceNamespace, apiHeaderName), apiToken); // 注入头到请求中 ((ServiceSynchronizationSoapBindingStub) ws).setHeader(apiKeyHeader); // 执行业务请求 ws.verifyCommunication();
调试排查方案
如果调整后仍报错,可开启Axis调试日志查看完整SOAP请求报文,确认头是否正确注入:
// 启动时添加以下系统配置开启请求日志 System.setProperty("axis.transport.logLevel", "debug");
你可以对比打印出的SOAP报文Header部分,确认和接口文档要求的格式是否一致。
内容的提问来源于stack exchange,提问作者Freddy Aguilar Rojas
相关产品推荐
相关产品推荐

