Web service是一个平台独立的跨语言、跨平台,低耦合的,自包含的、基于SOAP(simple object access protocal)协议的可编程的web的应用程序,可远程接口访问。可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。
1、WebService术语
再写helloworld之前,我们先来介绍一下webService里面的术语:
1) WSDL
网络服务描述语言是Web Service的描述语言,它包含一系列描述某个web service的定义。后面我们会根据helloworld来分析它的结构层次,来了解webService的实现原理。
2) SOAP
SOAP(simple object access protocal),简单对象访问协议是交换数据的一种协议规范,是一种轻量的、简单的、基于XML(标准通用标记语言下的一个子集)的协议,它被设计成在WEB上交换结构化的和固化的信息。
3) SEI
SEI(webservice endpoint interface),服务端口接口。基于SOAP的Java Web服务尽管可以只由单独的Java类来实现,但是遵从最佳实践原则,首先应该定义一个Java接口类,在此接口内声明Web服务需要完成或实现的业务方法。通常这类接口被称为”SEI”,即服务端点接口(Service Endpoint Interface)。
我们先来基于JDK的实现一个Webserivce的Helloworld,然后再来分析一下,Webservice的实现原理。
2、创建Webservice-service项目
1) 项目结构
2) UserService.Java
@WebService
public interface UserService {
void sayHi(String username);
}
3) UserServiceImpl.Java
@WebService
public class UserServiceImpl implements UserService {
@WebMethod
public void sayHi(String username) {
System.out.println("hi, " + username);
}
}
4) Publish.Java
public class Publish {
public static void main(String[] args) {
String url = "http://localhost:8080/demo/hello";
Endpoint.publish(url, new UserServiceImpl());
System.out.println("webservice publish service success...");
}
}
5) 发布服务
启动publish.Java文件。然后进入http://:8080/demo/hello?wsdl
就会出现以下画面:
这个webservice远程客户端调用服务的基础。如果你也能访问那么说明你的服务发布成功了,我们后面再来分析这个xml文件。
3、创建Webservice-client项目
1) 创建Webservice-client项目
使用maven创建webservice-client空项目,然后进入${webservice-client}/src/main/java.打开命令窗口,输入wsimport -keep http://localhost:8080/demo/hello?wsdl
就会生成客户端调用代码
调用。生成的项目结构图如下:
2) 调用远程服务
添加test类UserServiceTest.Java进行远程服务调用测试
public class UserServiceTest {
public static void main(String[] args) {
UserServiceImplService userService = new UserServiceImplService();
String hiWord = userService.getUserServiceImplPort().sayHi("carl");
System.out.println(hiWord);
}
}
运行结果如下:
4、分析WSDL
顶级元素为definitions元素,表示这个是webservice的描述语言,然后里面有以下几种子元素:
1、types
Type(消息类型):数据类型定义的容器,它使用某种类型系统(如 XSD).首先我们来看一下types元素
然后我们再打开schemaLocation里面的地址:
我们可以看到在type元素中定义了远程服务暴露接口中
- 调用方法所需参数
- 调用方法的返回值类型
2、message
message:通信数据的抽象类型化定义,它由一个或者多个 part 组成.
我们可以看到message元素中持有调用方法请求参数与返回值类型的引用。
3、portType
Port Type(端口类型):特定端口类型的具体协议和数据格式规范。
4、binding
Binding:特定端口类型的具体协议和数据格式规范。
5、service
Service:相关端口的集合,包括其关联的接口、操作、消息等
5、请求流程
其实熟悉Spring IOC的朋友可以看出来,这个和Spring的bean配置是不是很类型。Webservice的调用调用就是操作暴露服务的Service的Service这个容器。然后再调用服务的port.就可以获取到远程服务,这样就进行远程调用了。
请求的消息格式类型于:
<soap:…..>
<sayHello>
<arg0>carl</arg0>
</sayHello>
</soap>
然后返回的消息体类型于:
<sayHelloResponse>
<return>hi, carl</return>
</sayHelloResponse>
这就是webservice的请求的整个过程了,现在清晰了吗?