大西洲总督

tan90°

  • 主页
  • 随笔
所有文章 关于我

大西洲总督

tan90°

  • 主页
  • 随笔

Web services笔记

2019-03-31

什么是Web services

  Web services是一种远程调用技术。通过 Web services,可以让应用程序向全世界发布功能或消息,不受操作系统和编程语言的限制,实现不同的应用程序与平台之间的数据交换。Web Services的平台的元素包括:WSDL和SOAP、UDDI。

  • WSDL (Web Services Description Language)
      Web Services描述语言,是一种使用 XML 编写的文档,用来描述某个 web service详细情况,包括具体提供了哪些服务,服务的位置,、服务提供的操作(或方法),以及访问该服务需要遵循的的消息格式和协议细节等。

  • SOAP (Simple Object Access Protocol)
      简易对象访问协议,本质上还是 HTTP 协议,与普通的 HTTP 不同之处在于 SOAP 使用 XML 来编码消息。一条 SOAP 消息就是一个普通的 XML 文档,包含下列元素:必需的 Envelope 元素,可把此 XML 文档标识为一条 SOAP 消息、可选的 Header 元素,包含头部信息、必需的 Body 元素,包含所有的调用和响应信息,以及可选的 Fault 元素,提供有关在处理此消息所发生错误的信息。

  • UDDI (Universal Description Discovery and Integration)
      通用描述、发现及整合,是一个独立于平台的框架,通过 Internet 来描述服务,发现企业,并对企业服务进行集成。简单来说就是是一种由 WSDL 描述,用 SOAP 进行通信,存储 web services 的信息的目录 。类似于门户网站,让用户很方便地就能知道有哪些 Web Service 可以访问。

如何发布webservice

服务端

  • 第一步:定义接口

    1
    2
    3
    4
    5
    //需要在接口上加@WebService注解
    @WebService
    public interface HelloService {
    public String sayHello(String name);
    }
  • 第二步:定义接口实现类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    //实现类上也要加@WebService注解,而且要声明发布的具体是哪个接口
    @WebService(endpointInterface = "com.demo.webservice.service.HelloService")
    public class HelloServiceImpl implements HelloService {
    @Override
    public String sayHello(String userName) {
    if (userName != null) {
    StringBuilder builder = new StringBuilder();
    builder.append("Hello ");
    builder.append(userName);
    builder.append(", Today is ");
    String today = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
    builder.append(today);
    System.out.println("Service response success...");
    return builder.toString();
    }
    System.out.println("参数非法");
    return "非法参数,请输入姓名";
    }
    }
  • 第三步:发布服务

    1
    2
    3
    4
    5
    6
    7
    public class DemoServer {
    public static void main(String[] args) throws MalformedURLException {
    //通过Endpoint发布服务,指定wsdl文件地址以及服务接口实现类
    Endpoint.publish("http://127.0.0.1:8848/webservice/helloService",new HelloServiceImpl());
    System.out.println("Service published success...");
    }
    }
  • 第四步:检查服务发布结果

      在浏览器输入服务发布时指定的路径,末尾加上 ?wsdl 。按回车键,就可以看到到该服务的wsdl文件

    http://127.0.0.1:8848/webservice/helloService?wsdl

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <!-- 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.webservice.demo.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://impl.service.webservice.demo.com/" name="HelloServiceImplService">
    <import namespace="http://service.webservice.demo.com/" location="http://127.0.0.1:8848/webservice/helloService?wsdl=1"/>
    <binding xmlns:ns1="http://service.webservice.demo.com/" name="HelloServiceImplPortBinding" type="ns1:HelloService">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
    <operation name="sayHello">
    <soap:operation soapAction=""/>
    <input>
    <soap:body use="literal"/>
    </input>
    <output>
    <soap:body use="literal"/>
    </output>
    </operation>
    </binding>
    <service name="HelloServiceImplService">
    <port name="HelloServiceImplPort" binding="tns:HelloServiceImplPortBinding">
    <soap:address location="http://127.0.0.1:8848/webservice/helloService"/>
    </port>
    </service>
    </definitions>

客户端

  • 实现方法一:QNAME

    客户端需要定义跟服务端一样的接口(实际上就是两边同时依赖同一个接口)
    1
    2
    3
    4
    5
    //需要在接口上加@WebService注解
    @WebService
    public interface HelloService {
    public String sayHello(String name);
    }
调用服务端发布的 Web Service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class HelloClient {

public static void main(String[] args) throws MalformedURLException {
//wsdl文件的路径
URL url = new URL("http://127.0.0.1:8848/webservice/helloService?wsdl");

//要调用的服务
//两个参数分别从wsdl文件的 targetNamespace 和 name 中获取
QName qName = new QName("http://impl.service.webservice.demo.com/",
"HelloServiceImplService");

//创建服务实例工厂
Service serviceFactory = Service.create(url, qName);
//创建服务实例对象
HelloService helloService = serviceFactory.getPort(HelloService.class);
//调用接口中的方法
System.out.println("get response: "+helloService.sayHello("没头脑"));
}
}

控制台会打印:

Hello 没头脑, Today is 2019-03-31

  • 实现方法二:wsimport

    通过wsimport工具自动生成客户端代码
    按 win键+R键,在输入框中输入 cmd ,打开命令行窗口。在命令行中输入以下指令:
    1
    wsimport -s D:\work\webservice-demo\webservice-client2\src\main\java -p com.demo.webservice.service -keep http://localhost:9090/service/sayHello?wsdl

指令说明:wsimport -s “src目录” -p “生成类所在包名” -keep “wsdl发布地址”
操作成功后就会在对应的路径下自动生成java文件
自动生成的代码

调用服务端发布的 Web Service
1
2
3
4
5
6
7
8
public class HelloClient {
public static void main(String[] args) {
HelloServiceImplService serviceFactory = new HelloServiceImplService();
HelloService helloService = serviceFactory.getHelloServiceImplPort();
String response = helloService.sayHello("不高兴");
System.out.println(response);
}
}

控制台会打印:

Hello 不高兴, Today is 2019-03-31

参考资料

菜鸟教程 | Web Services 简介
菜鸟教程 | WSDL 教程
菜鸟教程 | SOAP 教程
赏

谢谢你请我吃糖果

扫一扫,分享到微信

微信分享二维码
xml笔记
通过Hexo搭建个人博客
© 2019 大西洲总督
Hexo Theme Yilia by Litten
  • 所有文章
  • 关于我

tag:

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • spring笔记

    2019-09-15

  • ElasticSearch

    2019-09-05

  • FastDFS

    2019-09-05

  • 2019-08-25

  • 2019-08-18

  • jsp

    2019-08-11

  • Cookie&Session

    2019-08-04

  • HttpServlet

    2019-07-28

  • Servlet

    2019-07-21

  • Linux定时任务删除指定时间前的文件

    2019-07-14

  • RabbitMQ

    2019-07-07

  • 集合

    2019-06-30

  • 分布式事务

    2019-06-23

  • Java多线程

    2019-06-16

  • java类

    2019-06-09

  • vim使用技巧

    2019-06-02

  • dubbo

    2019-05-26

  • Junit单元测试

    2019-05-19

  • 反射与注解

    2019-05-12

  • 《程序是怎样跑起来的》读书笔记

    2019-05-04

  • 《计算机是怎样跑起来的》读书笔记

    2019-05-03

  • maven笔记

    2019-04-28

  • RPC框架

    2019-04-21

  • java打包

    2019-04-14

  • 设计模式

    2019-04-07

  • xml笔记

    2019-04-07

  • Web services笔记

    2019-03-30

  • 通过Hexo搭建个人博客

    2019-03-27

  • 开端

    2019-03-26

  • Hello World

    2019-03-25

Just want to do something interesting.