WebService(一) 快速认知 什么是Web Service 快速入门 如何创建Webservice服务 极速开箱使用 客户端如何使用webservice接口

本文详细介绍了WebService的概念,包括XML、SOAP和WSDL的作用及结构,并通过一个Spring Boot实现的Webservice服务端案例,展示了服务的发布与WSDL文档的解读。同时,讨论了客户端如何利用wsimport工具生成调用代码,以及UDDI在服务发现中的作用。
摘要由CSDN通过智能技术生成


前言

最近使用webservice,遇到的问题不是很清楚,所以就通过博客的方式,稍详细一点地去了解。


什么是Web Service

Web service 是一个应用程序,它基于HTTP GET请求,暴露出可以通过Web调用的API。当然,Web service 还有更多的东西。Web services是建立可互操作的分布式应用程序的新平台。Web service平台是一套标准,它定义了应用程序如何在Web上实现互操作性。你可以用任何你喜欢的语言,在任何你喜欢的平台上写Web service ,只要我们可以通过Web service标准对这些服务进行查询和访问。

Web service平台提供一套标准的类型系统,用于沟通不同平台、编程语言和组件模型中的不同类型系统。让客户可以得到足够的信息来调用这个Web service。Web service采用RPC协议进行远程调用。为了达到互操作性,这种RPC协议与平台和编程语言无关。

组成Web service平台的三个技术:XSD、SOAP、WSDL

XML

可扩展的标记语言是Web service平台中表示数据的基本格式。
除了易于建立和易于分析外,XML主要的优点在于它既是平台无关的,又是厂商无关的。

无关性是比技术优越性更重要的:软件厂商是不会选择一个由竞争对手所发明的技术的。

XML解决了数据表示的问题,但它没有定义一套标准的数据类型。
例如,整形数到底代表什么?16位,32位,还是64位?这些细节对实现互操作性都是很重要的。

XML Schema(XSD)专门解决这个问题的一套标准。
定义了一套标准的数据类型,并给出了一种语言来扩展这套数据类型。

Web service平台用XSD来作为其数据类型系统的。
当你用某种语言(如VB. NET或C#)来构造一个Web service时,为了符合Web service标准,所有你使用的数据类型都必须被转换为XSD类型。

SOAP

简单对象访问协议(SOAP)它可以跨平台,跨防火墙,提供了标准的RPC方法来调用Web service。SOAP规范定义了SOAP消息的格式,以及怎样通过HTTP协议来使SOAP。SOAP也是基于XML(标准通用标记语言下的一个子集)和XSD的,XML是SOAP的数据编码方式。

SOAP=http+xml

SOAP结构

  • 必需的 Envelope 元素,可把此 XML 文档标识为一条 SOAP 消息
  • 可选的 Header 元素,包含头部信息
  • 必需的 Body 元素,包含所有的调用和响应信息
  • 可选的 Fault 元素,提供有关在处理此消息所发生错误的信息

WSDL

Web service描述语言(WSDL)是一个基于XML(标准通用标记语言下的一个子集)的语言,用于描述Web service及其函数、参数和返回值。WSDL既是机器可阅读的,又是人可阅读的。一些最新的开发工具既能根据你的Web service生成WSDL文档,又能导入WSDL文档,生成调用相应Web service的代码。
非正式介绍Web service功能,函数调用时的参数,存在严重的问题:其他工具(如Visual Studio)因为这些工具根本就不了解你的Web service。解决方法是:用机器能阅读的方式提供一个正式的描述文档。

案例

说得再多没有案例来的实在

服务端

提供服务接口

pom
引入依赖,一个是lombok,方便用的。一个是spring

 <dependencies>
    <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.22</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>

User

package org.antry.model;
import lombok.Data;
@Data
public class User {
    private Integer id;
    private Integer age;
    private String name;
    private Boolean sex;
    private String hobbies;
    private String extend;
}

UserService

package org.antry.service;
public interface UserService {
    public String showUser(Integer id);
}

UserServiceImpl

package org.antry.service.impl;
import org.antry.model.User;
import org.antry.service.UserService;
import org.springframework.stereotype.Service;

import javax.jws.WebService;
@Service
@WebService
public class UserServiceImpl implements UserService {
    @Override
    public String showUser(Integer id) {
        User u = new User();
        u.setId(id);
        u.setAge(15);
        u.setName("antry");
        u.setSex(true);
        u.setHobbies("boy");
        u.setExtend("have a lot of money");
        return u.toString();
    }
}

PublishTest

package org.antry;
import org.antry.service.impl.UserServiceImpl;
import javax.xml.ws.Endpoint;

public class PublishTest
{
    public static void main( String[] args )
    {
        Endpoint.publish("http://127.0.0.1:11111/user",new UserServiceImpl());
    }
}

运行Test
暴露接口,访问

http://127.0.0.1:11111/user?wsdl

在这里插入图片描述

看到这样的界面说明成功暴露了接口

<!--  Published by JAX-WS RI (http://jax-ws.java.net). RI's version is JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e.  -->
<!--  Generated by JAX-WS RI (http://jax-ws.java.net). RI's version is JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e.  -->
<definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://impl.service.antry.org/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://impl.service.antry.org/" name="UserServiceImplService">
<types>
<xsd:schema>
<xsd:import namespace="http://impl.service.antry.org/" schemaLocation="http://127.0.0.1:11111/user?xsd=1"/>
</xsd:schema>
</types>
<message name="showUser">
<part name="parameters" element="tns:showUser"/>
</message>
<message name="showUserResponse">
<part name="parameters" element="tns:showUserResponse"/>
</message>
<portType name="UserServiceImpl">
<operation name="showUser">
<input wsam:Action="http://impl.service.antry.org/UserServiceImpl/showUserRequest" message="tns:showUser"/>
<output wsam:Action="http://impl.service.antry.org/UserServiceImpl/showUserResponse" message="tns:showUserResponse"/>
</operation>
</portType>
<binding name="UserServiceImplPortBinding" type="tns:UserServiceImpl">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
<operation name="showUser">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
<service name="UserServiceImplService">
<port name="UserServiceImplPort" binding="tns:UserServiceImplPortBinding">
<soap:address location="http://127.0.0.1:11111/user"/>
</port>
</service>
</definitions>

WSDL文档结构

在这里插入图片描述

  • Service: 相关端口的集合,包括其关联的接口、操作、消息等。
  • Binding: 特定端口类型的具体协议和数据格式规范
  • portType: 服务端点,描述 web service可被执行的操作方法,以及相关的消息,通过binding指向portType
  • message: 定义一个操作(方法)的数据参数
  • types: 定义 web service 使用的全部数据类型
<xsd:schema>
<xsd:import namespace="http://impl.service.antry.org/" schemaLocation="http://127.0.0.1:11111/user?xsd=1"/>
</xsd:schema>

打开schemaLocation的地址,看到方法的参数类型,返回值类型。

<xs:schema xmlns:tns="http://impl.service.antry.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0" targetNamespace="http://impl.service.antry.org/">
<xs:element name="showUser" type="tns:showUser"/>
<xs:element name="showUserResponse" type="tns:showUserResponse"/>
<xs:complexType name="showUser">
<xs:sequence>
<xs:element name="arg0" type="xs:int" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="showUserResponse">
<xs:sequence>
<xs:element name="return" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:schema>

阅读方式

WSDL文档应该从下往上阅读。

  • 先看service标签,看相应port的binding属性,然后通过值查找上面的binding标签。
  • 通过binding标签可以获得具体协议等信息,然后查看binding的type属性
  • 通过binding的type属性,查找对应的portType,可以获得可操作的方法和参数、返回值等。
  • 通过portType下的operation标签的message属性,可以向上查找message获取具体的数据参数信息。

客户端

wsimport是jdk自带的webservice客户端工具,可以根据wsdl文档生成客户端调用代码(java代码)。无论服务器端的WebService是用什么语言写的,都可以生成调用webservice的客户端代码。wsimport.exe位于JAVA_HOME\bin目录下

常用参数为:

-d<目录>  - 将生成.class文件。默认参数。
-s<目录> - 将生成.java文件。
-p<生成的新包名> -将生成的类,放于指定的包下

创建一个客户端空项目,cmd命令行进入此项目的src\main\java目录
使用以下命令生成客户端代码

wsimport -s . http://127.0.0.1:11111/user?wsdl

在这里插入图片描述
可以看到,文件夹下自动生成了代码
在这里插入图片描述
ClientTest
编写测试代码

package org.antry.test;

import org.antry.service.impl.UserServiceImpl;
import org.antry.service.impl.UserServiceImplService;

/**
 * @author: T_Antry
 * @date: 2021/10/17 17:55
 * @description:
 */
public class ClientTest {
    public static void main(String[] args) {
        //创建服务视图,视图是从wsdl文件的service标签的name属性获取
        UserServiceImplService service = new UserServiceImplService();
        //获取服务实现类,实现类从wsdl文件的portType的name属性获取
        UserServiceImpl impl = service.getPort(UserServiceImpl.class);
        //获取查询方法,从portType的operation标签获取
        String s = impl.showUser(1);
        System.out.println(s);
    }
}

运行
在这里插入图片描述

UDDI

UDDI 是一种目录服务,企业可以使用它对 Web services 进行注册和搜索。
如果我们要使用一种服务,但是不知道地址(wsdl等),我们就可以在UDDI中查找。

大部分情况下,我们都是知道服务地址的。

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值