1、WebService

WebService简介

Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所使用的语言、平台或内部协议是什么,都可以相互交换数据。

简单的说,WebService就是一种跨编程语言和跨操作系统平台的远程调用技术。所谓跨编程语言和跨操作平台,就是说服务端程序采用java编写,客户端程序则可以采用其他编程语言编写,反之亦然。跨操作系统平台则是指服务端程序和客户端程序可以在不同的操作系统上运行。 远程调用,就是一台计算机的应用可以调用其他计算机上的应用。例如:支付宝,支付宝并没有银行卡等数据,它只是去调用银行提供的接口来获得数据。还有天气预报等,也是气象局把自己的系统服务以webservice服务的形式暴露出来,让第三方网站和程序可以调用这些服务功能。

WebService原理

XML、SOAP和WSDL就是构成WebService平台的三大技术

SOAP协议

SOAP(Simple Object Access Protocol/简单文件传输协议)是一个轻量的、简单的、基于XML的协议。使用http发送的XML格式的数据,它可以跨平台,跨防火墙,SOAP不是webservice的专有协议。

SOAP包括四个部分:

SOAP的基本结构包含以下元素

wsdl说明书

Web Service描述语言WSDL(WebService Definition Language)就是用机器能阅读的方式提供的一个正式描述文档而基于XML(标准通用标记语言下的一个子集)的语言,用于描述Web Service及其函数、参数和返回值。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的。

抽象定义
具体定义

portType、message和type描述了Web服务是什么,binding描述了如何使用Web服务,port和service描述了Web服务的位置。

UDDI

UDDI(Universal Description, Discovery and Integration/通用描述、发现和集成)主要提供基于Web服务的注册和发现机制,为Web服务提供三个重要的技术支持:

但是使用webservice并不是必须使用UDDI,因为用户通过WSDL知道了web service的地址,可以直接通过WSDL调用webservice。

JAVA WebService

Java 中共有三种WebService 规范,分别是JAXM&SAAJJAX-WS(JAX-RPC)JAX-RS

原生实现

服务端

1、编写服务接口

@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);
}

2、服务接口实现类

@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;
    }
}

2、发布服务

public class Server {

    public static void main(String[] args) {
        TestService testService = new TestServiceImpl();
        Endpoint.publish("http://localhost:8080/services/testService",testService);
    }
}

3、浏览器访问wsdl

访问地址http://localhost:8080/services/testService?wsdl

image-20230605141521624

客户端

原生调用

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插件

Wizdler,可以对webservice接口进行测试

发送请求

image-20230605141815046

响应

image-20230605141913796

Axis2与CXF

目前java开发WebService的框架主要包括Axis2和CXF,如果你需要多语言的支持,你应该选择Axis2。如果你需要把你的实现侧重java并希望和Spring集成,CXF就是更好的选择,特别是把你的WebService嵌入其他的程序中

img