WebService是啥:
WebService是一种跨编程语言和跨操作系统平台的远程调用技术。
服务端程序采用java编写,客户端程序则可以采用其他编程语言编写,反之亦然!指服务端程序和客户端程序可以在不同的操作系统上运行。
XML+XSD,SOAP和WSDL就是构成WebService平台的三大技术。
SOAP协议定义了SOAP消息的格式,SOAP协议是基于HTTP协议的,SOAP也是基于XML和XSD的,XML是SOAP的数据编码方式。
WSDL文件保存在Web服务器上,通过一个url地址就可以访问到它。客户端要调用一个WebService服务之前,要知道该服务的WSDL文件的地址。
CXF是啥:
Apache CXF 是一个开源的 Services 框架,CXF 帮助您利用 Frontend 编程 API 来构建和开发 Services ,像 JAX-WS 。这些 Services 可以支持多种协议,比如:SOAP、 XML/ HTTP、RESTful HTTP 或者 CORBA ,并且可以在多种 传输协议上运行,比如:HTTP、JMS 或者 JBI,CXF 大大简化了 Services 的创建,同时它继承了 XFire 传统,一样可以天然地和 Spring 进行无缝集成
soupheader是啥:
在Web Services方法进行通信使用SOAP遵循标准的SOAP格式,该格式的一部分是在XML文档中编码的数据。XML文档包含一个Envelope根元素(由必需的Body元素和可选的Header元素构成)。Body元素由特定于消息的数据构成。可选的Header元素可以包含不与特定消息直接相关的其他信息。
需要添加的soapheader
<soapenv:Header>
<tns:RequestSOAPHeader xmlns:tns="http://sys.webservice.client">
<tns:user xmlns="http://sys.webservice.client">username</tns:user>
<tns:password xmlns="http://sys.webservice.client">password</tns:password>
</tns:RequestSOAPHeader>
</soapenv:Header>
编码:
JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();
jaxWsProxyFactoryBean.getOutInterceptors().add(new AddSoapHeader());
//jaxWsProxyFactoryBean.setUsername("root");
//jaxWsProxyFactoryBean.setPassword("***");
//List<Interceptor<? extends Message>> clientAuthValidateInterceptors = new ArrayList<>();
// 添加soap header 信息
// 注入拦截器,getOutInterceptors代表调用服务端时触发,getInInterceptors就是被调用才触发
//clientAuthValidateInterceptors.add(new AddSoapHeader());
//jaxWsProxyFactoryBean.setOutInterceptors(clientAuthValidateInterceptors);
jaxWsProxyFactoryBean.setServiceClass(ISysNewsToRMTWebService.class);
jaxWsProxyFactoryBean.setAddress("http://***:8080/sys/webService?wsdl");
ISysNewsService service = (ISysNewsService)jaxWsProxyFactoryBean.create();
SysNewsForm form = RequestForm.getNoNullForm();
try {
service.findTemplateList(form);
} catch (Throwable e) {
System.out.println(e.getMessage());
throw new RuntimeException(e);
}
}
import java.util.List;
import javax.xml.namespace.QName;
import org.apache.cxf.binding.soap.SoapHeader;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
import org.apache.cxf.headers.Header;
import org.apache.cxf.helpers.DOMUtils;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class AddSoapHeader extends AbstractSoapInterceptor {
public static final String xml_namespaceURI = "http://sys.webservice.client";
public static final String xml_header = "soapenv:Header";
public static final String xml_request_header = "tns:RequestSOAPHeader";
public static final String xml_username = "tns:user";
public static final String xml_password = "tns:password";
public AddSoapHeader() {
// 定义拦截器阶段
super(Phase.WRITE);
}
/**
* @Description: 拦截器操作
* @param message
* 被拦截到的消息
* @throws Fault
*/
@Override
public void handleMessage(SoapMessage message) {
String userId = "";
String 密码 = "";
Document doc = DOMUtils.createDocument();
Element root = doc.createElement(xml_header);
Element eUserId = doc.createElement(xml_username);
eUserId.setTextContent(userId);
eUserId.setAttribute("xmlns",xml_namespaceURI);
Element ePwd = doc.createElement(xml_password);
ePwd.setAttribute("xmlns",xml_namespaceURI);
ePwd.setTextContent(password);
Element child = doc.createElement(xml_request_header);
child.setAttribute("xmlns:tns",xml_namespaceURI);
child.appendChild(eUserId);
child.appendChild(ePwd);
root.appendChild(child);
QName qname = new QName("RequestSOAPHeader");
SoapHeader head = new SoapHeader(qname, root);
List<Header> headers = message.getHeaders();
headers.add(head);
}
}