WebService简介
- WebService使运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成
- 根据WebService规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据
- Web Service是自描述、 自包含的可用网络模块, 可以执行具体的业务功能
WebService原理
WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术,通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册
-
Web服务提供者设计实现Web服务,并将调试正确后的Web服务通过Web服务中介者发布,并在UDDI注册中心注册; (发布)
-
Web服务请求者向Web服务中介者请求特定的服务,中介者根据请求查询UDDI注册中心,为请求者寻找满足请求的服务; (发现)
-
Web服务中介者向Web服务请求者返回满足条件的Web服务描述信息,该描述信息用WSDL写成,各种支持Web服务的机器都能阅读;(发现)
-
利用从Web服务中介者返回的描述信息生成相应的SOAP消息,发送给Web服务提供者,以实现Web服务的调用;(绑定)
-
web服务提供者按SOAP消息执行相应的Web服务,并将服务结果返回给Web服务请求者。(绑定)
XML
- (Extensible Markup Language)扩展型可标记语言。面向短期的临时数据处理、面向万维网络,是SOAP的基础
SOAP
- (Simple Object Access Protocol)简单对象存取协议。是通信协议
- 当用户通过UDDI找到你的WSDL描述文档后,他通过SOAP调用你建立的Web服务中的一个或多个操作
- SOAP是XML文档形式的调用方法的规范,它可以支持不同的底层接口,像HTTP(S)或者SMTP
WSDL
- (Web Services Description Language) WSDL 文件是一个 XML 文档,用于说明一组 SOAP 消息以及如何交换这些消息。
UDDI
- (Universal Description, Discovery, and Integration)是一种描述文档来引导系统查找相应服务的机制
- UDDI利用SOAP消息机制(标准的XML/HTTP)来发布,编辑,浏览以及查找注册信息,采用XML格式来封装各种不同类型的数据,并且发送到注册中心或者由注册中心来返回需要的数据。
WebService实例(JWS)
服务端实现
- 开发一个webservice业务接口
public interface HelloWebService {
String hello(String name);
}
- 实现类,类实现@WebService ,方法实现 @WebMethod。
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService
public class HelloWebServiceImpl implements HelloWebService {
@WebMethod
@Override
public String hello(String name) {
String str = "hello:" + name;
System.out.println(str);
return str;
}
}
- 暴露类
import javax.xml.ws.Endpoint;
public class PublishWebService {
public static void main(String args[]) {
HelloWebService helloWebService = new HelloWebServiceImpl();
String address = "http://localhost:8000/hellowebservice"; //发布到的地址
Endpoint.publish(address, helloWebService);
System.out.println("WebService发布成功");
}
}
//访问http://localhost:8000/hellowebservice?wsdl
客户端调用
- Tool-->WebServices-->Generate Java Code From WSDL
- Web service wsdl url 是指明WSDL文档的位置 (http://localhost:8000/hellowebservice?wsdl)
- 生成,编写测试类
public class TestWebService {
public static void main(String[] args) {
HelloWebServiceImplService service = new HelloWebServiceImplService();
HelloWebServiceImpl hello = service.getHelloWebServiceImplPort();
hello.hello("xxx");
}
}
AXIS调用远程的WebService
此时,为了避免远程调用时参数传递null,服务端实现类方法上的参数应加上
@WebParam(name = "name", mode = WebParam.Mode.IN, targetNamespace = "http://yuansu.com/")
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import javax.xml.rpc.ParameterMode;
import javax.xml.namespace.QName;
import java.net.URL;
public class TestWebService {
public static void main(String[] args) {
//命名空间 即在wsdl中的targetNamespace="http://yuansu.com/"
String soapaction = "http://yuansu.com/";
String endpoint = "http://localhost:8000/hellowebservice";
String method = "hello";
String parameterName = "name";
String parameterValue = "xxx";
String result = "";
try {
Service service = new Service();
Call call = (Call) service.createCall();
// 设置远程调用路径
call.setTargetEndpointAddress(new URL(endpoint));
//指定调用命名空间下的方法
call.setOperationName(new QName(soapaction, method));
// 设置参数名 :参数名 ,参数类型:String, 参数模式:'IN' or 'OUT'
call.addParameter(new QName(soapaction, parameterName), XMLType.XSD_STRING, ParameterMode.IN);
// 设置返回值类型
call.setReturnType(XMLType.XSD_STRING);
call.setUseSOAPAction(true);
// 远程调用
result = (String) call.invoke(new Object[]{parameterValue});
} catch (Exception var8) {
result = "";
}
System.out.println(result);
}
}