Java Web之在Web应用中访问Web服务
write:2022-5-18
上文:Java Web之开发JavaMail Web应用
在Java Web的第一篇文章:Java web之web的概念和web的运作原理和web服务 的最后已经了解了web服务和scope,web服务确立了一种基于Internet网的分布式软件体系结构,web服务支持两个运行在不同操作系统平台上并且用不同编程语言实现的系统进行相互通信,一个系统向另一个系统公开的服务被统称为web服务;
通俗易懂的理解web服务:
web服务架构:
web服务主要涉及两个因素:
因此本文主要讲解这两个因素;
文章目录
1. SOAP的基本概念
1.1 SOAP简介
SOAP(Simple Object Access Protocol)即简单对象访问协议,是在分散或分布式的环境中交换信息的简单协议,它以XML作为数据传送方式。
SOAP采用的数据传输协议可以是HTTP/HTTPS(现在用得最广泛)协议,也可以是SMTP/POP3协议,还可以是为一些应用而专门设计的特殊通信协议。
1.2 SOAP协议的数据格式
SOAP协议规定无论是客户端发送的SOAP请求还是服务器端生成SOAP响应结果,都是以XML格式作为数据传送方式;
eg:一个XML格式的SOAP响应结果
<?xml version="1.0" encoding="UTF-8" ?>
<soapenv:Envelope //根元素(信封)
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body> //正文
<sayHelloResponse
soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<sayHelloReturn xsi:type="xsd:string">Hello:weiqin</sayHelloReturn>
</sayHelloResponse>
</soapenv:Body>
</soapenv:Envelope>
1.3 系统间采用SOAP通信
按照分层模型,SOAP协议和HTTP协议都属于应用层协议;下图中,可把SOAP协议可以建立在HTTP协议的基础之上;
把SOAP请求/SOAP响应包装为HTTP请求/HTTP响应,然后在网络上传输;
1.4 SOAP的工作模式
(1)一种称为RPC(Remote Procedure Call)远程过程调用
(2)另一种叫法不统一,在Microsoft的文档中称做Document-Oriented,而在Apache的文档中,称为Message-Oriented,这是一种可以利用XML交换更为复杂的结构数据的应用,通常以SMTP作为传输协议。
这里我们主要学习RPC工作模式;
1)SOAP RPC
可以把SOAP RPC简单地理解为这样一个开放协议:SOAP=RPC+HTTP+XML。它有以下特征:
采用HTTP作为通信协议,采用客户/服务模式
RPC作为统一的远程方法调用途径
XML作为数据传送的格式,允许服务提供者和客户经过防火墙在Internet上进行通信交互
2)SOAP RPC的工作流程
1.5 SOAP客户访问SOAP服务的流程
(1)客户端创建一个XML格式的RPC请求,它包含了提供服务的服务器的URI、客户请求调用的方法名和参数信息。如果参数是对象,则必须进行序列化操作。
(2)客户端的协议连接器把XML格式的SOAP请求包装为HTTP请求,即把SOAP请求作为HTTP请求的正文,并且增加HTTP请求头。
(3)服务器端的协议连接器接收到客户端发送的HTTP请求,对其进行解析,获得其中的请求正文,请求正文就是客户端发送的XML格式的SOAP请求。
(4)服务器对XML格式的SOAP请求进行解析,如果参数是对象,先对其进行反序列化操作,然后执行客户请求的方法。
(5)服务器执行方法完毕后,如果方法的返回值是对象,则先对其进行序列化操作,然后把返回值包装为XML格式的SOAP响应。
(6)服务器端的协议连接器把XML格式的SOAP响应包装为HTTP响应,即把SOAP响应作为HTTP响应的正文,并且增加HTTP响应头。
(7)客户端的协议连接器接收到服务器端发送的HTTP响应,对其进行解析,获得其中的响应正文,响应正文就是服务器端发送的XML格式的SOAP响应。
(8)客户端解析XML格式的SOAP响应,如果返回值是对象,则先对其进行反序列化操作,最后获得返回值。
2. Apache AXIS框架简介
Apache AXIS是一个实现了SOAP协议的框架,官网下载地址:http://ws.apache.org/axis
2.1 Apache AXIS的结构
Tomcat充当Apache-AXIS Web应用的容器,而Apache-AXIS Web应用充当SOAP服务/Web服务的容器;
2.2 发布Apache-AXIS Web应用
(1) sourcecode/soap/目录下的axis子目录为AXIS Web应用,把这个axis子目录拷贝到Tomcat的webapps目录下。
(2)把sourcecode/soap/lib 目录下的activation.jar、mail.jar和xerces.jar拷贝到Tomcat的lib目录下。
这样Apache-AXIS Web应用就发布成功了,启动Tomcat应用,通过浏览器访问axis应用就会看到主页,
点击“Validate”可以进入AXIS的配置信息页面查看是否有报错;
3. 利用AXIS来创建SOAP服务和SOAP客户程序
Tomcat充当Apache-AXIS Web应用的容器,而Apache-AXIS Web应用充当SOAP服务/Web服务的容器;
前面我们已经把Apache-AXIS Web应用发布到Tomcat中了,现在我们需要创建SOAP服务并将它发布到Apache-AXIS Web应用中;
3.1 创建提供SOAP服务的Java 类
在提供SOAP服务的Java 类中可以定义被SOAP客户调用的方法,这些方法必须声明为public类型。
这些方法的参数或返回类型必须能进行XML映射。AXIS为一些常用Java数据类型提供了标准的XML映射:
对于用户自定义的Java类,如果这个类的实例将会作为方法参数或者是返回值在网络.上传输,那么必须创建专门的XML序列化器和反序列化器,并且在web发布描述符文件中通过type mapping 元素来指定映射关系;
eg:这里的helloservice类就是一 个我们自己创建的能够提供soap服务Java类
package mypack;
public class HelloService {
public String sayHello(String username) {
return "Hello:"+username;
}
}
源文件:mypack/HelloService.java
类文件发布到:< CATALINA_HOME>/webapps/axis/WEBINF/classes/mypack/HelloService.class
3.2 创建SOAP服务的发布描述符文件
SOAP服务的发布描述符文件用来定义SOAP服务,包括提供服务的类名,以及可被SOAP客户调用的方法。
以下是HelloService的发布描述文件,名为deploy.wsdd:
<deployment name="test" xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
//deployment:根元素,可以包含多个service元素
//定义一个SOAP服务
<service name="urn:helloservice" provider="java:RPC">//name:唯一标识 provider:服务的实现语言和服务方式
<parameter name="className" value="mypack.HelloService" />
<parameter name="allowedMethods" value="sayHello" />
</service>
</deployment>
3.3 删除已经发布的SOAP服务
如果要删除已经发布的SOAP服务,则可以使用< undeployment>元素。
例如,如果删除helloservice服务,则可以创建如下的undeploy.wsdd文件:
<undeployment name="test" xmlns="http://xml.apache.org/axis/wsdd/">
<service name="urn:helloservice"/> //需要删除的服务的名字
</undeployment>
3.4 管理SOAP服务
(1)SOAP服务被发布到Apache-AXIS web应用中。
(2)AXIS提供了基于命令行的SOAP服务管理工具,它是由org.apache.axis.client.AdminClient类来实现的
(3)SOAP服务管理工具可提供以下操作:
发布SOAP服务
删除SOAP服务
(4)发布SOAP服务时,只要指定WSDD文件即可。在DOS命令行输入如下命令:
java org.apache.axis.client.AdminClient deploy.wsdd
以上命令将把deploy.wsdd文件中声明的SOAP服务发布到SOAP服务器(即axis应用)中。
(5)删除SOAP服务时,只要指定包含< undeployment>元素的WSDD文件即可,使用方法如下:
java org.apache.axis.client.AdminClient undeploy.wsdd
运行AdminClient类有两个注意:
1)一个就是我们需要把deployed.wsdd文件中所提到的hello service类
的.class文件(类文件)事先发布到axis应用中:类文件发布到:< CATALINA_HOME>/webapps/axis/WEBINF/classes/mypack/HelloService.class
2)首先要在classpath中设置AdminClient类的类文件以及它做依赖的类文件的路径,AdminClient类的类文件以及它做依赖的类都位于axis软件包的lib目录下面的相关jar文件中
3.5 创建SOAP客户程序
HelloClient:
package mypack;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import javax.xml.namespace.QName;
public class HelloClient{
public static void main(String[] args) {
try {
String username="Guest";
if(args.length!=0) username=args[0];
String endpoint = "http://localhost:8080/axis/services/helloservice";
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress( new java.net.URL(endpoint) );
call.setOperationName(new QName("urn:helloservice", "sayHello") );
String ret = (String) call.invoke( new Object[] { username } );
System.out.println(ret);
} catch (Exception e) {
e.printStackTrace();
}
}
}
HelloClient访问helloservice服务包含如下步骤。
(1)读取命令行参数,设置username的值:
String username=“Guest”;
if(args.length!=0) username=args[0];
(2)定义helloservice服务的位置:
String endpoint =“http://localhost:8080/axis/services/helloservice”;
(3)创建Service实例,然后通过Service实例创建Call实例。它提供了发出SOAP请求的功能。在发出SOAP请求之前,首先应该为Call对象设置相关的SOAP请求信息:
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress( new java.net.URL(endpoint) );
call.setOperationName(new QName(“urn:helloservice”, “sayHello”) );
(4)调用Call实例的invoke方法:
String ret = (String) call.invoke( new Object[] { username } );
3.6 运行SOAP客户程序
运行HelloClient时,应该确保helloservice服务已经发布,Apache-AXIS Web应用处于运行状态。
此外,运行HelloClient时需要把< AXIS_HOME>/lib目录下的所有JAR文件以及xerces.jar加入到classpath中,
然后在命令行运行如下命令:java mypack.HelloClient Tom
将会看到下面的输出内容:Hello:Tom //是由HelloService的sayHello方法返回的
客户程序访问名为helloservice的Web服务的时序图
4. 练习题
- 问题:关于SOAP,以下哪些说法正确?
选项:
A) SOAP是基于XML语言的数据交换协议。
B) SOAP可以建立在HTTP协议基础之上。
C) SOAP要求服务器端与客户端都是Java程序。
D) SOAP属于应用层的协议。
答案:A,B,D
-
问题:用Tomcat服务器来发布Apache-AXIS Web应用时,Tomcat有什么作用?
选项:
(A) 接收HTTP请求
(B) 解析HTTP请求
© 充当Apache-AXIS Web应用的容器
(D) 把SOAP响应包装为HTTP响应,并发送HTTP响应。
(E) 解析SOAP请求,对其中的参数进行反序列化。
(F) 把HTTP响应包装为SOAP响应,并发送SOAP响应。
答案:A,B,C,D -
问题:用Tomcat服务器来发布Apache-AXIS Web应用时, Apache-AXIS Web应用有什么作用?
选项:
(A)把SOAP服务的返回结果包装为符合HTTP规范的HTTP响应结果
(B)解析SOAP请求,对其中的参数进行反序列化
(C)调用相应的SOAP服务
(D)把SOAP服务的返回结果包装为SOAP响应
答案:B,C,D
(A)把SOAP服务的返回结果包装为符合HTTP规范的HTTP响应结果 Tomcat完成
- 问题:对于建立在HTTP协议上的SOAP,SOAP请求与HTTP请求之间是什么关系?
选项:
(A) SOAP请求是HTTP请求的正文部分。
(B) HTTP请求是SOAP请求的正文部分。
© SOAP请求是HTTP请求的头部分。
(D) 两者没有关系。
答案:A