WebService 入门

21 篇文章 3 订阅
14 篇文章 7 订阅

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();
	}

}

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

结构化思维wz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值