如何使用Axis调用含Header信息的Soup WebService?求Java示例
Java调用带WSSE安全Header及自定义Header的WebService示例
一、Axis框架实现步骤
1. 生成客户端代码
使用Axis自带的WSDL2Java工具生成客户端代码:
java org.apache.axis.wsdl.WSDL2Java -p com.test.client https://128.0.0.1/test/wsdl
生成后会得到对应服务的Stub类和相关实体类。
2. 编写调用代码
手动构造WSSE安全Header和自定义的loginInformation Header:
import org.apache.axis.client.Call; import org.apache.axis.client.Service; import org.apache.axis.message.SOAPHeaderElement; import org.w3c.dom.Document; import org.w3c.dom.Element; import javax.xml.namespace.QName; import javax.xml.parsers.DocumentBuilderFactory; import java.net.URL; public class AxisWebServiceClient { public static void main(String[] args) throws Exception { String endpoint = "https://128.0.0.1/test/wsdl"; Service service = new Service(); Call call = (Call) service.createCall(); call.setTargetEndpointAddress(new URL(endpoint)); // 设置服务方法的QName(根据生成的Stub类调整) QName operationQName = new QName("http://gheo1.test.com", "Request"); call.setOperationName(operationQName); // 构造WSSE安全Header Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); Element securityElement = doc.createElementNS("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "wsse:Security"); securityElement.setAttribute("xmlns:wsu", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"); Element usernameTokenElement = doc.createElement("wsse:UsernameToken"); Element usernameElement = doc.createElement("wsse:Username"); usernameElement.setTextContent("test_user"); Element passwordElement = doc.createElement("wsse:Password"); passwordElement.setAttribute("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"); passwordElement.setTextContent("test123"); usernameTokenElement.appendChild(usernameElement); usernameTokenElement.appendChild(passwordElement); securityElement.appendChild(usernameTokenElement); SOAPHeaderElement wsseHeader = new SOAPHeaderElement(securityElement); call.addHeader(wsseHeader); // 构造自定义loginInformation Header Element loginInfoElement = doc.createElementNS("com.test.common", "soapheader:loginInformation"); Element userIdElement = doc.createElement("soapheader:loginUserID"); userIdElement.setTextContent("USERID"); Element userTypeElement = doc.createElement("soapheader:loginUserType"); userTypeElement.setTextContent("CUSTOMER"); Element uniqueKeyElement = doc.createElement("soapheader:loginUserUniqueKey"); uniqueKeyElement.setTextContent("123456"); Element userRoleElement = doc.createElement("soapheader:loginUserRole"); userRoleElement.setTextContent("CUSTOMER"); loginInfoElement.appendChild(userIdElement); loginInfoElement.appendChild(userTypeElement); loginInfoElement.appendChild(uniqueKeyElement); loginInfoElement.appendChild(userRoleElement); SOAPHeaderElement customHeader = new SOAPHeaderElement(loginInfoElement); call.addHeader(customHeader); // 构造请求参数(使用生成的实体类赋值) RequestArg arg0 = new RequestArg(); arg0.setAccountNumber("123"); arg0.setGroupNumber("456"); arg0.setAuthGroupNumber("789"); arg0.setAuthAccountNumber("123"); arg0.setAuthCertificateNumber("555"); Object[] params = new Object[]{arg0}; Object response = call.invoke(params); System.out.println("服务响应:" + response.toString()); } }
二、CXF框架实现步骤(推荐,更简洁)
1. 生成客户端代码
使用CXF的wsdl2java工具:
wsdl2java -p com.test.client https://128.0.0.1/test/wsdl
2. 编写调用代码
通过拦截器添加WSSE Header,直接API设置自定义Header:
import com.test.client.Request; import com.test.client.RequestArg; import com.test.client.WebServicePortType; import com.test.client.WebServiceService; import org.apache.cxf.endpoint.Client; import org.apache.cxf.frontend.ClientProxy; import org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor; import org.apache.wss4j.dom.handler.WSHandlerConstants; import javax.xml.namespace.QName; import java.util.HashMap; import java.util.Map; public class CxfWebServiceClient { public static void main(String[] args) { WebServicePortType port = new WebServiceService().getWebServicePort(); Client client = ClientProxy.getClient(port); // 添加WSSE安全拦截器 Map<String, Object> props = new HashMap<>(); props.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN); props.put(WSHandlerConstants.USER, "test_user"); props.put(WSHandlerConstants.PASSWORD_TYPE, "PasswordText"); props.put(WSHandlerConstants.PW_CALLBACK_CLASS, TestPasswordCallback.class.getName()); client.getOutInterceptors().add(new WSS4JOutInterceptor(props)); // 添加自定义loginInformation Header QName loginInfoQName = new QName("com.test.common", "loginInformation", "soapheader"); Map<String, Object> loginInfoMap = new HashMap<>(); loginInfoMap.put("loginUserID", "USERID"); loginInfoMap.put("loginUserType", "CUSTOMER"); loginInfoMap.put("loginUserUniqueKey", "123456"); loginInfoMap.put("loginUserRole", "CUSTOMER"); client.getRequestContext().put(Client.REQUEST_HEADERS, Map.of(loginInfoQName, loginInfoMap)); // 构造请求参数 RequestArg arg0 = new RequestArg(); arg0.setAccountNumber("123"); arg0.setGroupNumber("456"); arg0.setAuthGroupNumber("789"); arg0.setAuthAccountNumber("123"); arg0.setAuthCertificateNumber("555"); Request request = new Request(); request.setArg0(arg0); // 调用服务 Object response = port.request(request); System.out.println("服务响应:" + response.toString()); } // 密码回调类 public static class TestPasswordCallback implements org.apache.wss4j.dom.callback.PasswordCallback { @Override public void handle(javax.security.auth.callback.Callback[] callbacks) throws javax.security.auth.callback.UnsupportedCallbackException { org.apache.wss4j.dom.callback.PasswordCallback pc = (org.apache.wss4j.dom.callback.PasswordCallback) callbacks[0]; pc.setPassword("test123"); } } }
注意事项
- 确保项目引入对应框架依赖:Axis需
axis、axis-jaxrpc等;CXF需cxf-core、cxf-rt-frontend-jaxws、cxf-rt-ws-security等。 - 生成客户端代码前确认WSDL地址可正常访问,若有证书问题需提前处理。
- 代码中的QName、类名需根据实际生成的客户端代码调整。
内容的提问来源于stack exchange,提问作者Moon
相关产品推荐
相关产品推荐

