Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所使用的语言、平台或内部协议是什么,都可以相互交换数据。
简单的说,WebService就是一种跨编程语言和跨操作系统平台的远程调用技术。所谓跨编程语言和跨操作平台,就是说服务端程序采用java编写,客户端程序则可以采用其他编程语言编写,反之亦然。跨操作系统平台则是指服务端程序和客户端程序可以在不同的操作系统上运行。 远程调用,就是一台计算机的应用可以调用其他计算机上的应用。例如:支付宝,支付宝并没有银行卡等数据,它只是去调用银行提供的接口来获得数据。还有天气预报等,也是气象局把自己的系统服务以webservice服务的形式暴露出来,让第三方网站和程序可以调用这些服务功能。
XML、SOAP和WSDL就是构成WebService平台的三大技术
SOAP(Simple Object Access Protocol/简单文件传输协议)是一个轻量的、简单的、基于XML的协议。使用http发送的XML格式的数据,它可以跨平台,跨防火墙,SOAP不是webservice的专有协议。
SOAP包括四个部分:
SOAP的基本结构包含以下元素
Web Service描述语言WSDL(WebService Definition Language)就是用机器能阅读的方式提供的一个正式描述文档而基于XML(标准通用标记语言下的一个子集)的语言,用于描述Web Service及其函数、参数和返回值。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的。
portType、message和type描述了Web服务是什么,binding描述了如何使用Web服务,port和service描述了Web服务的位置。
UDDI(Universal Description, Discovery and Integration/通用描述、发现和集成)主要提供基于Web服务的注册和发现机制,为Web服务提供三个重要的技术支持:
但是使用webservice并不是必须使用UDDI,因为用户通过WSDL知道了web service的地址,可以直接通过WSDL调用webservice。
Java 中共有三种WebService 规范,分别是JAXM&SAAJ
、JAX-WS(JAX-RPC)
、JAX-RS
。
JAX-WS
JAX-WS
(Java API For XML-WebService)。早期的基于SOAP 的JAVA 的Web 服务规范JAX-RPC(java API For XML-Remote Procedure Call)目前已经被JAX-WS 规范取代,JAX-WS 是JAX-RPC 的演进版本,但JAX-WS 并不完全向后兼容JAX-RPC,二者最大的区别就是RPC/encoded 样式的WSDL,JAX-WS 已经不提供这种支持。JAX-RPC 的API 从JAVA EE5 开始已经移除,如果你使用J2EE1.4,其API 位于javax.xml.rpc.包。JAX-WS(JSR 224)规范的API 位于javax.xml.ws.包,其中大部分都是注解,提供API 操作Web 服务(通常在客户端使用的较多,由于客户端可以借助SDK 生成,因此这个包中的API 我们较少会直接使用)。JAXM&SAAJ
JAXM
(JAVA API For XML Message)主要定义了包含了发送和接收消息所需的API,相当于Web 服务的服务器端,其API 位于javax.messaging.*包,它是Java EE 的可选包,因此你需要单独下载。SAAJ
(SOAP With Attachment API For Java,JSR 67)是与JAXM 搭配使用的API,为构建SOAP 包和解析SOAP 包提供了重要的支持,支持附件传输,它在服务器端、客户端都需要使用。这里还要提到的是SAAJ 规范,其API 位于javax.xml.soap.*包。JAXM&SAAJ
与JAX-WS
都是基于SOAP 的Web 服务,相比之下JAXM&SAAJ 暴漏了SOAP更多的底层细节,编码比较麻烦,而JAX-WS 更加抽象,隐藏了更多的细节,更加面向对象,实现起来你基本上不需要关心SOAP 的任何细节。那么如果你想控制SOAP 消息的更多细节,可以使用JAXM&SAAJ。JAX-RS
JAX-RS
是JAVA 针对REST(Representation State Transfer)风格制定的一套Web 服务规范,由于推出的较晚,该规范(JSR 311,目前JAX-RS 的版本为1.0)并未随JDK1.6 一起发行。@WebService(
name = "testService", //port name
serviceName = "testService", // 服务名称
targetNamespace = "http://top.ygnag.test/service" // namespace
)
public interface TestService {
@WebMethod(operationName = "testMethod")
@WebResult(name = "message")
String testMethod(@WebParam(name = "name") String name);
}
@WebService(
name = "testService", //port name
serviceName = "testService", // 服务名称
targetNamespace = "http://top.ygnag.test/service" // namespace
)
public class TestServiceImpl implements TestService{
@Override
@WebMethod(operationName = "testMethod")
@WebResult(name = "message")
public String testMethod(@WebParam(name = "name") String name) {
return "accept success : " + name;
}
}
public class Server {
public static void main(String[] args) {
TestService testService = new TestServiceImpl();
Endpoint.publish("http://localhost:8080/services/testService",testService);
}
}
访问地址http://localhost:8080/services/testService?wsdl
public class Client {
public static void main(String[] args) throws Exception{
//创建WSDL文件的URL
URL wsdlDocumentLocation = new URL("http://127.0.0.1:8080/services/testService?wsdl");
//创建服务名称
//1.namespaceURI - 命名空间地址
//2.localPart - 服务名
QName serviceName=new QName("http://top.ygnag.test/service","testService");
Service service=Service.create(wsdlDocumentLocation, serviceName);
//获取服务实现类
TestService testService= service.getPort(TestService.class);
//执行方法
String message = testService.testMethod("webservice");
System.out.println(message);
// accept success : webservice
}
}
Wizdler
,可以对webservice接口进行测试
发送请求
响应
目前java开发WebService的框架主要包括Axis2和CXF,如果你需要多语言的支持,你应该选择Axis2。如果你需要把你的实现侧重java并希望和Spring集成,CXF就是更好的选择,特别是把你的WebService嵌入其他的程序中