WebService 入门

Posted 结构化思维wz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WebService 入门相关的知识,希望对你有一定的参考价值。

WebService

WebService概述

WebService 即Web服务,一种跨编程语言跨操作系统的远程调用技术。主要用于多个异构系统的数据交互。

​ Web Service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML标准通用标记语言下的一个子集)标准描述、发布、发现、协调和配置这些应用程序,用于开发分布式的交互操作的应用程序。 [1]

​ Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据。Web Service是自描述、 自包含的可用网络模块, 可以执行具体的业务功能。Web Service也很容易部署, 因为它们基于一些常规的产业标准以及已有的一些技术,诸如标准通用标记语言下的子集XML、HTTP。Web Service减少了应用接口的花费。Web Service为整个企业甚至多个组织之间的业务流程的集成提供了一个通用机制。

WebService分类

SOAP架构的WebService

SOAP协议:简单对象访问协议,所谓SOAP架构的WebService,指的是这种WebService底层使用的是SOAP协议传递数据。

RestFul架构的WebService

SOAP架构WebService三要素

  1. SOAP:(Simple Access Protocol)

    简单对象访问协议:是一种基于XML的协议,它使应用程序通过HTTP协议来交换数据。

    简单理解为:SOAP = Http+XML

    SOAP协议在今天主要有:SOAP1.1 和 SOAP1.2协议。

    注:SOAP不是WebService的专有协议,很多的应用也有使用SOAP协议如:SMTP等。

  2. WSDL:(Web Service Description Language)

    是基于XML用于描述WebService的函数,参数,返回值等信息。

    通俗理解为:WebService的使用说明书。

  3. UDDI:(Universal Description Discovery and Intergration)

    是一种目录服务,企业可以使用它对WebService进行注册和搜索,从而达到资源共享,促进全球经济合作。(了解即可,现在基本不用)

阅读WSDL

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SggkyR93-1639013037174)(WebService.assets/image-20211207110739993.png)]

<definitions>
    <types>
    	定义WebService 使用的数据类型
    </types>
    <message>
        每个消息均由一个或多个部件组成,可以把它当做java中一个函数调用的参数。
    </message>
    <portType>
    	它类似Java中的一个函数库(或一个模块、或一个类)
    </portType>
    <bingding>
    	为每个端口定义消息格式和协议细节
    </bingding>
</definitions>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yL3qNgK7-1639013037175)(WebService.assets/image-20211207112042819.png)]

阅读顺序:从下往上

  1. 服务视图名称
  2. 找服务试图名称标签中对应的binding name
  3. 通过binding标签中的type属性 找到portType name
  4. portType 就是服务的核心类 WebService中所有调用的服务都在这

如何开发WebService

一个WebService 分为两端 :客户端,服务端

Spring+CXF服务端开发

  1. 引入相关maven依赖
  2. 开发SEI(Service Endpoint Interface)服务发布接口
  3. 开发SEI实现类
  4. 使用Spring整合CXF 发布webService

Spring+CXF客户端开发

  1. 引入相关的依赖

    cxf-spring-boot-starter-jaxws
    
  2. 根据wsdl生成客户端代码

  3. 调用方法

WebService实战案例

client.properties

#Web服务的URL
address=url略
#Web服务接口
service_class=略
#Web服务标识
service_bean=略
#用户
user=略
#密码
password=略

WebServiceConfig.java


import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * 解析配置文件
 * 
 */
public class WebServiceConfig 
	private static WebServiceConfig cfg = new WebServiceConfig();

	// Web服务的URL
	private String address;
	
	// Web服务接口
	private Class serviceClass;
	
	// Web服务标识
	private String serviceBean;
	
	// 用户
	private String user;
	
	// 密码
	private String password;

	private WebServiceConfig() 
		loadCfg();
	

	public static WebServiceConfig getInstance() 
		return cfg;
	

	/**
	 * 解析配置文件
	 */
	private void loadCfg() 
		Properties prop = new Properties();
		InputStream confStream = this.getClass().getResourceAsStream(
				"client.properties");

		try 
			prop.load(confStream);
			this.address = prop.getProperty("address");
			String serviceClassName = prop.getProperty("service_class");
			this.serviceClass = Class.forName(serviceClassName);
			this.serviceBean = prop.getProperty("service_bean");
			this.user = prop.getProperty("user");
			this.password = prop.getProperty("password");

		 catch (Exception e) 
			// TODO 自动生成的catch块
			e.printStackTrace();
		 finally 
			try 
				confStream.close();
			 catch (IOException e) 
				// TODO 自动生成的catch块
				e.printStackTrace();
			
		

	

	public String getAddress() 
		return address;
	

	public void setAddress(String address) 
		this.address = address;
	

	public Class getServiceClass() 
		return serviceClass;
	

	public void setServiceClass(Class serviceClass) 
		this.serviceClass = serviceClass;
	

	public String getServiceBean() 
		return serviceBean;
	

	public void setServiceBean(String serviceBean) 
		this.serviceBean = serviceBean;
	

	public String getUser() 
		return user;
	

	public void setUser(String user) 
		this.user = user;
	

	public String getPassword() 
		return password;
	

	public void setPassword(String password) 
		this.password = password;
	



AddSoapHeader.java


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 AddSoapHeader() 
		super(Phase.WRITE);
	

	/**
	 * 处理消息,添加消息头
	 * 
	 * @param message SOAP消息
	 * @throws Exception
	 */
	public void handleMessage(SoapMessage message) throws Fault 
		WebServiceConfig cfg = WebServiceConfig.getInstance();
		Document doc = DOMUtils.createDocument();
		
		// 添加用户名信息
		Element userElement = doc.createElement("tns:user");
		userElement.setTextContent(cfg.getUser());
		
		// 添加密码信息
		Element pwdElement = doc.createElement("tns:password");
		pwdElement.setTextContent(cfg.getPassword());

		// 创建消息头节点
		Element root = doc.createElementNS("http://sys.webservice.client"
		    , "tns:RequestSOAPHeader");
		root.appendChild(userElement);
		root.appendChild(pwdElement);

		QName qname = new QName("RequestSOAPHeader");
		SoapHeader head = new SoapHeader(qname, root);
		List<Header> headers = message.getHeaders();
		headers.add(head);
	


WebServiceClient.java


import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;

import java.util.HashMap;
import java.util.Map;

/**
 * WebService客户端
 * 
 */
public class WebServiceClient 

	/**
	 * 主方法
	 * 
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception 
		WebServiceConfig cfg = WebServiceConfig.getInstance();

		Object service = callService(cfg.getAddress(), cfg.getServiceClass());
		// 请在此处添加业务代码

	
	
	/**
	 * 调用服务,生成客户端的服务代理
	 * 
	 * @param address WebService的URL
	 * @param serviceClass 服务接口全名
	 * @return 服务代理对象
	 * @throws Exception
	 */
	public static Object callService(String address, Class serviceClass)
			throws Exception 

		JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
		
		// 记录入站消息
		factory.getInInterceptors().add(new LoggingInInterceptor());
		
		// 记录出站消息
		factory.getOutInterceptors().add(new LoggingOutInterceptor());
		
		// 添加消息头验证信息。如果服务端要求验证用户密码,请加入此段代码
		// factory.getOutInterceptors().add(new AddSoapHeader());

		factory.setServiceClass(serviceClass);
		factory.setAddress(address);		
        
        // 创建服务代理并返回
		return factory.create();
	



以上是关于WebService 入门的主要内容,如果未能解决你的问题,请参考以下文章

推荐net开发cad入门阅读代码片段

Web Service入门简介(一个简单的WebService示例)

webService简单入门

WebService入门

WebService入门实例教程

WebService案例入门(基础篇)