因业务需要,接手某个项目需要接外部一个很旧的系统,必须使用 Axis 1.4 进行Web Service调用。为什么要用Axis 框架?因为手中项目采用的是 Spring Boot 框架以及外部系统的不可描述的原因,使用 Spring 框架自带的WebService 客户端调用对方接口会出现各种问题。费了老大劲,总算解决了 Axis 和 Spring Boot 的兼容问题,接口可以调通。
项目上线后一段时间,外部接口进行了调整,要求在调用 Web Service 时在 Http 请求上增加请求头。于是百度和Google并用,并没有找到相关资料。
对于 Web Service 接口调用,通常参数是加到SOAP信封内的,这种在SOAP请求的Http请求头上传参的操作闻所未闻,不知道对端方案怎么评审通过的。
Axis 1.4 框架最后一次更新还是在 2006 年,那时候楼主还在念高中,鬼知道这个框架是内部怎么处理的,于是翻阅源码,总算找到以下一段:
![](http://www.weiwei.wang/wp-content/uploads/2020/10/image-1024x843.png)
根据上下文,增加以下代码,完事:
final Call call = (Call) new Service().createCall(); //设置接口URL,命名空间,参数名等 call.setTargetEndpointAddress(new URL(servicesURL)); call.setOperationName(new QName(namespace, localpart)); call.addParameter(paramName, org.apache.axis.Constants.XSD_STRING, javax.xml.rpc.ParameterMode.IN); call.setReturnType(org.apache.axis.Constants.XSD_STRING); call.setEncodingStyle("UTF-8"); //设置 HttpClient 请求头 final Hashtable headers = new Hashtable<>(); headers.put(key, value); call.setProperty(HTTPConstants.REQUEST_HEADERS, headers); //调用远程接口 final Object response = call.invoke(new Object[] { reqValue });