Web Services 基于Apache Axis2 生成客户端代码示例

news2024/11/25 16:48:21

webservice 一种古老的技术,现在基本上已经弃用,但也有许多古董项目在用,整理并记录下自己的使用过程,避免更多的人踩坑。

Web Services 生成客户端代码步骤

  • 1 Apache Axis2下载安装
    • 1.1 认识Apache Axis2
    • 1.2 下载Apache Axis2
  • 2 通过CMD生成客户端代码
  • 3 实现服务端访问
    • 3.1 Apache Axis2 手工访问
    • 3.2 通过生成的代码访问

1 Apache Axis2下载安装

1.1 认识Apache Axis2

Apache Axis2™ 是一个 Web Services JSON / SOAP / WSDL 引擎,是广泛使用的Apache Axis SOAP 堆栈。
Apache Axis2™ 是一个开源的 Web Services 框架,支持SOAP和RESTful Web Services。使用Maven来构建Axis2项目可以使项目更加规范,方便管理和部署。

Axis2 具有许多新功能、增强功能和行业特性 规范实现。提供的主要功能如下: 遵循:

  • 速度 - 轴 2 使用 它自己的对象模型和 StAX(XML 流 API)解析为 实现比早期版本的 Apache 更高的速度 轴。
  • 低内存足迹 - Axis2在设计时始终考虑到低内存足迹。
  • AXIOM - Axis2提供了自己的轻量级对象模型AXIOM,用于消息处理,该模型可扩展、高性能并且方便开发人员。
  • 热部署 - Axis2配备了在系统启动和运行时部署Web服务和处理程序的功能。换句话说,新的服务可以添加到系统中,而不必关闭服务器。只需将所需的Web服务存档放入存储库中的services目录中,部署模型就会自动部署该服务并使其可供使用。
  • 异步Web服务 - Axis2现在支持使用非阻塞客户机和传输的异步Web服务和异步Web服务调用。
  • MEP支持 - Axis2现在可以灵活地支持消息交换模式(MEP),并内置对WSDL 2.0中定义的基本MEP的支持。
  • 灵活性 - Axis2体系结构为开发人员提供了完全的自由,可以将扩展插入到引擎中,以进行自定义报头处理、系统管理和任何您能想到的事情。
  • 稳定性 - Axis2定义了一组已发布的接口,与Axis的其他部分相比,这些接口的变化相对缓慢。
  • 面向组件的部署 - 您可以轻松地定义handler的可重用网络,以实现应用程序的公共处理模式,或者将其分发给合作伙伴。
  • 传输框架 - 对于集成和使用传输,我们有一个干净简单的抽象(例如,在各种协议(如SMTP、FTP、面向消息的中间件等)上的SOAP的发送方和侦听器),并且引擎的核心是完全独立于传输的。
  • WSDL支持 - Axis2支持Web服务描述语言(1.1和2.0版本),这允许您轻松构建存根以访问远程服务,还可以从Axis2自动导出已部署服务的机器可读描述。
  • JSON支持 - Axis2支持使用JavaScript对象表示法以及GSON和Moshi创建Web服务,这允许您轻松构建基于POJO的接收和返回JSON的服务。
  • 组合和可扩展性 - 模块和阶段改进了对组合性和可扩展性的支持。模块支持可组合性,还可以以简单干净的方式支持新的WS-*规范。但是它们不能热部署,因为它们会改变系统的整体行为。

1.2 下载Apache Axis2

Apache Axis2 Download
发行版本下载图示

2 通过CMD生成客户端代码

我们以常用的天气预报 Web 服务中的getWeatherbyCityName1方法为示例,生成对应的客户端代码。
天气预报WSDL文档地址:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?WSDL
(1)将下载的axis2-1.8.2-bin.zip进行解压缩。
(2)通过cmd命令,进入到 axis2-1.8.2\bin 目录下。
(3)通过 wsdl2java 命令生成客户端代码 ,命令如下:

wsdl2java -uri http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?WSDL -p com.cloud.note.client -d adb -s

成功图示
(4)生成成功后,代码在bin/src文件夹内,如图所示
代码路径图示
(5)将上述生成的Java文件拷贝到自己的项目中,同时引入pom.xml文件

<dependencies>
    <dependency>
        <groupId>dom4j</groupId>
        <artifactId>dom4j</artifactId>
        <version>1.6.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.axis2</groupId>
        <artifactId>axis2-kernel</artifactId>
        <version>1.8.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.axis2</groupId>
        <artifactId>axis2-adb</artifactId>
        <version>1.8.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.axis2</groupId>
        <artifactId>axis2-transport-local</artifactId>
        <version>1.8.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.axis2</groupId>
        <artifactId>axis2-transport-http</artifactId>
        <version>1.8.2</version>
    </dependency>
</dependencies>

3 实现服务端访问

3.1 Apache Axis2 手工访问

package com.cloud.note.client;

import java.util.Iterator;

import javax.xml.namespace.QName;

import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMAttribute;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
import org.apache.axis2.rpc.client.RPCServiceClient;

public class ClientMain {

	public static void main(String[] args) throws AxisFault {
		// 创建 ServiceClient 对象
		ServiceClient serviceClient = new ServiceClient();

		// 设置服务端点 URL
		EndpointReference targetEPR = new EndpointReference("http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl");
		Options options = serviceClient.getOptions();
		options.setTo(targetEPR);

		// 设置 Action 和操作名称
		options.setAction("http://WebXml.com.cn/getWeatherbyCityName");
		OMFactory factory = OMAbstractFactory.getOMFactory();
		OMNamespace ns = factory.createOMNamespace("http://WebXml.com.cn/", "ns");
		OMElement operation = factory.createOMElement("getWeatherbyCityName", ns);

		// 设置请求参数
		OMElement cityName = factory.createOMElement("theCityName", ns);
		cityName.setText("北京");
		operation.addChild(cityName);

		// 发送请求并接收响应
		OMElement response = serviceClient.sendReceive(operation);

		// 处理响应
		OMElement result = response.getFirstElement();
		String weather = result.getText();
		System.out.println("北京的天气: " + weather);

		// 遍历子元素
		OMElement child = result.getFirstElement();
		while (child != null) {
			String childName = child.getLocalName();
			String childValue = child.getText();
			System.out.println(childName + ": " + childValue);
			child = (OMElement) child.getNextOMSibling();
		}

		// 遍历属性
		Iterator<OMAttribute> attributes = result.getAllAttributes();
		while (attributes.hasNext()) {
			OMAttribute attribute = attributes.next();
			String attributeName = attribute.getLocalName();
			String attributeValue = attribute.getAttributeValue();
			System.out.println(attributeName + ": " + attributeValue);
		}

	}

	private void moreWays() throws AxisFault {
		// 1创建RPCServiceClient---此方法不适用天气查询
		RPCServiceClient serviceClient = new RPCServiceClient();
		// 配置服务地址(此处http://www.webxml.com.cn/WebServices/WeatherWebService.asmx为WSDL文件末尾的service location)
		Options options = serviceClient.getOptions();
		EndpointReference targetEPR = new EndpointReference("http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl");
		options.setTo(targetEPR);
		
		// 如果服务端由.NET编写完成,则需要设置Action,否则会出现  org.apache.axis2.AxisFault: 服务器未能识别 HTTP头 SOAPAction的值  异常
		//设置Action
		options.setAction("http://WebXml.com.cn/getWeatherbyCityName");
		// 设置要请求的方法名称和参数(此处http://WebXml.com.cn/为WSDL文件中的targetNamespace属性值)
		QName opAddEntry = new QName("http://WebXml.com.cn/", "getWeatherbyCityName");

		Object[] opAddEntryArgs = new Object[] { "杭州" };
		Class[] returnTypes = new Class[] { String.class };
		// 访问服务
		Object[] response = serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, returnTypes);

		// 处理响应
		System.out.println("杭州的天气:" + response[0]);
	}
}

3.2 通过生成的代码访问

package com.cloud.note.client;

import com.cloud.note.client.WeatherWebServiceStub.ArrayOfString;
import com.cloud.note.client.WeatherWebServiceStub.GetWeatherbyCityNameResponse;

public class ClientMain {

	public static void main(String[] args) throws Exception {
	
		WeatherWebServiceStub stub = new WeatherWebServiceStub();
		WeatherWebServiceStub.GetWeatherbyCityName getWeatherbyCityName = new WeatherWebServiceStub.GetWeatherbyCityName();
		getWeatherbyCityName.setTheCityName("杭州");
		GetWeatherbyCityNameResponse weatherbyCityName = stub.getWeatherbyCityName(getWeatherbyCityName);
		ArrayOfString getWeatherbyCityNameResult = weatherbyCityName.getGetWeatherbyCityNameResult();
		String[] strings = getWeatherbyCityNameResult.getString();
		for (int i = 0; i < strings.length; i++) {
			System.out.println(strings[i]);
		}
	}
}


  1. 根据城市或地区名称查询获得未来三天内天气情况、现在的天气实况、天气和生活指数 ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/116200.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

当地的新员工入职培训

香港 (Xinwengao.com) — 在中国生活和工作的所有外国人都面临文化冲击。在他们的入职前期&#xff0c;学校管理层通常会让他们接受广泛的入职培训。这些培训项目旨在为外籍教师提供文化和专业培训。在外籍教师开始他们的教学之旅之前&#xff0c;向他们灌输文化同理心的美德非…

天气后报网爬虫及数据分析(python)

从天气后报网&#xff08;http://www.tianqihoubao.com&#xff09;中爬取绵阳市某一年的历史天气信息&#xff0c;包括每天最高气温、最低气温、天气状况、风向等&#xff0c;完成以下功能&#xff1a; &#xff08;1&#xff09;将获取的数据信息存储到“data.csv”文件中&a…

微服务(三)——远程调用

目录前言1. RestTemplate1. 导入依赖2. 代码3. 常用方法2. jodd-http1. 引入依赖2. 代码3. 测试3. Feign1. 引入依赖2. 使用过程3. 自定义配置4. 优化前言 微服务都是独立部署的&#xff0c;要实现一个业务可能需要多个服务之间的通信&#xff0c;所以远程调用必不可少&#x…

html标签分类及其他知识

1、标签按照类型可以划分为三种类型&#xff1a; block&#xff1a;div、p、ul、li、h1… 1、独占一行2、支持所有样式3、不写宽的时候&#xff0c;跟父元素的宽相同4、所占区域是一个矩形 inline&#xff1a;span、a、em、strong、img… 1、挨在一起2、有些样式不支持&#x…

编译原理——求后缀表达式、三元式、四元式

一、求后缀表达式 可能就是一填空题&#xff0c;考试应该也不会太复杂&#xff0c;要会&#xff0c;掌握着由外到内求解思想即可&#xff1b; 其实就是二叉树的后序遍历&#xff0c;左右根&#xff1b;拆分的顺序就是由左到右顺序进行&#xff0c;小括号内的最后拆&#xff0…

4线触摸屏控制器ET2046介绍

4线触摸屏控制器ET2046简介 ET2046是4线触摸屏控制器&#xff0c;支持1.5V&#xff5e;5.5V的低压I/O 接口。ET2046具有内置2.5V电压源&#xff0c;可用于辅助输入、电池监测和温度检测模式的测量。在不使用时&#xff0c;也可将内置电压源关闭以节约电力。内置电压源最低可工作…

JS 执行机制

1、JS 是单线程 JavaScript 语言的一大特点就是单线程&#xff0c;也就是说&#xff0c;同一个时间只能做一件事。这是因为 Javascript 这门脚本语言诞生的使命所致——JavaScript 是为处理页面中用户的交互&#xff0c;以及操作 DOM 而诞生的。比如我们对某个 DOM 元素进行添加…

建议使用这些方法来优化Mac,运行速度直线上升

Mac系统的稳定性和流畅性一直备受大家称赞&#xff0c;这也是大多数人选择Mac的原因&#xff0c;尽管如此&#xff0c;我们仍不时地对Mac进行优化、调整&#xff0c;以使其比以前更快、更流畅地运行。以下是小编分享给各位的Mac优化方法&#xff0c;记得保存哦~ 一、释放被过度…

Groovy安全高效的执行(死循环,休眠,危险方法)

背景 在很多场景下有需要执行异步任务&#xff0c;或者执行用户的自定义任务时&#xff0c;通常我们会使用Groovy脚本能力来完成任务。通过groovy动态脚本能力&#xff0c;在业务执行过程中动态执行不同业务线或者用户的脚本&#xff0c;来满足不同需求。 这样可以非常方便的进…

关于CSS选择器优先级的规则说明

简单规则&#xff1a; !important > 行内样式 > id选择器 > 类选择器 > 元素选择器 > 通配选择器 选择器举例说明&#xff1a; !important&#xff1a; <h1 id"title">好好学习&#xff0c;天天向上</h1> <style type"text/…

ArcGIS基础实验操作100例--实验1绘制自定义线、垂线、平行线

本实验专栏来自于汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a; 通过百度网盘分享的文件&#xff1a;地理信息系统基础实验100例 链接:https://pan.baidu.com/s/1sprJ2eyDAkYWiLwyuTIf1g 提取码:gb7y 复制这段内容…

Doris(一)

1、Doris简介 Doris是由百度大数据研发&#xff0c;是一个现代化的MPP&#xff08;Massively Parallel Processing&#xff09;大规模并行处理的分析型数据库产品。仅需亚秒级响应时间即可获得查询结果&#xff0c;有效地支持实时数据分析。 Apache Doris 的分布式架构非常简洁…

北上广深杭房价高压下,这也许是软件测试员扎根的唯一出路...

简单算一笔账&#xff0c;目前小公司软件测试员工资一般是1万出头&#xff0c;年薪普遍在20万以下。在不考虑通胀和工资增长的情况下&#xff0c;除去吃喝需要攒30年才能攒出一线城市房子的首付&#xff0c;以这样的收入水平&#xff0c;基本上没法扎根。 想拿高薪最好的途径就…

API文档、技术文档工具 - ShowDoc - 使用

1.应用场景 主要用于使用适合IT团队的 API文档、技术文档工具 进行项目文档书写以及进行开发。 2.学习/操作 1.文档阅读 ShowDoc ShowDoc - demo 安装/升级手册 GitHub - star7th/showdoc: ShowDoc is a tool greatly applicable for an IT team to share documents online一…

LeetCode Hot 100~Day3

目录 字母异位词分组 最大子数组和 跳跃游戏 合并区间 不同路径 最小路径和 爬楼梯 颜色分类 子集 单词搜索 二叉树的中序遍历 不同的二叉搜索树 字母异位词分组 题目链接&#xff1a;49. 字母异位词分组 示例 输入: strs ["eat", "tea&quo…

[DonkeyCar][树莓派]基础01 - 首次配置 - WIFI

2022年圣诞节到来啦&#xff0c;疫情把刚刚起来的工作似乎又慢了下来&#xff0c;在冲刺决赛圈的同时&#xff0c;也许开一个新的领域&#xff0c;写一个博客是比较好的方式。 一、前言 拿到树莓派开发板的时候&#xff0c;一般&#xff0c;供应商都会配合烧录的镜像。但是&am…

《图解TCP/IP》阅读笔记(第七章 7.6)—— BGP 边界网关协议

7.6 BGP BGP&#xff08;Border Gateway Protocol&#xff09;&#xff0c;边界网关协议&#xff0c;是用于连接不同组织机构&#xff08;或者说不同自治系统&#xff09;的一种协议&#xff0c;其属于EGP&#xff08;外部网关协议&#xff09;&#xff0c;我们在7.2节中了解过…

01)FastDFS文件服务器安装和测试可用性

FastDFS简介 ​ FastDFS是一个轻量级的开源分布式文件系统。2008年4月份开始启动。类似google FS的一个轻量级分布式文件系统,纯C实现,支持Linux、FreeBSD、AIX等UNIX系统。 ​ 主要解决了大容量的文件存储和高并发访问的问题,文件存取时实现了负载均衡。实现了软件方式的…

PicoRV32 笔记 06 压缩指令集

PicoRV32 中实现压缩指令集选项 COMPRESSED_ISA&#xff0c;当设置COMPRESSED_ISA1开启支持16位指令集。压缩指令有很多优点&#xff0c;当我们在FPGA中实现PicoRV32的时候&#xff0c;使用RISCV的C扩展能有效的增大代码密度&#xff0c;原本32位1条指令变为16位一条指令&#…

synchronized 和 ReentrantLock 的区别

&#x1f388;专栏链接:多线程相关知识详解 synchronized和ReentrantLock的 区别 缺点 优势 synchronized和ReentrantLock两者都是可重入锁 ReentrantLock的三个核心方法: Ⅰ.lock(加锁) Ⅱ.unlock(解锁) Ⅲ.tryLock(尝试加锁) import java.util.concurrent.locks.Reentrant…